今天学习java反射时,想通过反射对创建的java.util.LinkedList 对象的内部头节点进行一些修改,但是出现了非法反射警告,有什么办法能够跳过这个检测机制吗?目前使用jdk11.
测试代码如下:
package com.niss.datastructrue.list;
import java.lang.reflect.Field;
public class ListTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
java.util.List<Integer> list = new java.util.LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Field head = list.getClass().getDeclaredField("first");
head.setAccessible(true);
Field next = head.get(list).getClass().getDeclaredField("next");
next.setAccessible(true);
next.set(head.get(list),null);
System.out.println(list);
}
}
控制台输出:
"D:\Program Files\Java\jdk-11.0.5\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\apps\IDEA-U\ch-0\193.6494.35\lib\idea_rt.jar=58180:D:\Program Files\JetBrains\apps\IDEA-U\ch-0\193.6494.35\bin" -Dfile.encoding=UTF-8 -classpath E:\JavaStudy\DataStructrue-study\target\test-classes;E:\JavaStudy\DataStructrue-study\target\classes;C:\Users\Ni187\.m2\repository\org\apache\logging\log4j\log4j-core\2.13.0\log4j-core-2.13.0.jar;C:\Users\Ni187\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.0\log4j-api-2.13.0.jar com.niss.datastructrue.list.ListTest
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.niss.datastructrue.list.ListTest (file:/E:/JavaStudy/DataStructrue-study/target/test-classes/) to field java.util.LinkedList.first
WARNING: Please consider reporting this to the maintainers of com.niss.datastructrue.list.ListTest
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.LinkedList$ListItr.next(LinkedList.java:897)
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:472)
at java.base/java.lang.String.valueOf(String.java:2951)
at java.base/java.io.PrintStream.println(PrintStream.java:897)
at com.niss.datastructrue.list.ListTest.main(ListTest.java:20)
Process finished with exit code 1