public class Demo {
public static void main(String[] args) throws ClassNotFoundException, Exception, SecurityException {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
//反射节点的next
//Node这个类是LinkedList的一个内部类
//所以首先需要反射Node这个内部类
Class LinkedList$Nodeclazz = Class.forName("java.util.LinkedList$Node");
//得到Node这个内部类的next属性对象
Field nextField = LinkedList$Nodeclazz.getDeclaredField("next");
nextField.setAccessible(true);
//反射集合的首个节点
//反射LinkedList
Class LinkedListClazz = Class.forName("java.util.LinkedList");
//得到这个链表的first这个成员变量的对象
Field firstField = LinkedListClazz.getDeclaredField("first");
firstField.setAccessible(true);
//反射集合的末尾节点
Field lastField = LinkedListClazz.getDeclaredField("last");
lastField.setAccessible(true);
//得到最后一个节点的对象
Object last = lastField.get(list);
//得到第一个节点的对象
Object first = firstField.get(list);
System.out.println(first);
//给集合的最后节点下一个元素记录未第一个节点的地址值,形成循环
Object obj = nextField.get(last);
//null打印结果为null,因为最后一个节点的下一个是没有节点的
System.out.println(obj);
//把最后一个节点的下一个设置为第一个节点
//形成了一个圆圈
nextField.set(last, first);
//找5这个元素,因为LinkedList在底层中从第一个节点开始匹配
//如果第一个节点不是5,那么就找下一个节点
//因为集合中没有5,所以形成了一个死循环。
System.out.println(list.contains(new Integer(5)));
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |