我正在使用Javassist在运行时编辑JFrame
类,(添加了一个新的Constructor)
ClassPool pool = ClassPool.getDefault();
pool.importPackage("javax.swing.TransferHandler$HasGetTransferHandler");
CtClass jFrameClass= pool.get("javax.swing.JFrame");
jFrameClass.addConstructor(CtNewConstructor.make(new CtClass[]{pool.get("java.lang.String"),CtClass.intType,CtClass.intType},new CtClass[0],"{this($1);setSize($2,$3);}",jframe));
jFrameClass.toClass();
不幸的是,这抛出一个
IllegalAccessError
,线程“主”中的异常javassist.CannotCompileException:通过java.lang.IllegalAccessError:类javax.swing.JFrame无法访问其超级接口javax.swing.TransferHandler $ HasGetTransferHandler
在javassist.ClassPool.toClass(ClassPool.java:1120)
在javassist.ClassPool.toClass(ClassPool.java:1063)
在javassist.ClassPool.toClass(ClassPool.java:1021)
在javassist.CtClass.toClass(CtClass.java:1259)
在io.github.potatophil.PSStart.compile(PSStart.java:46)
在io.github.potatophil.PSStart.main(PSStart.java:24)
原因:java.lang.IllegalAccessError:类javax.swing.JFrame无法访问其超级接口javax.swing.TransferHandler $ HasGetTransferHandler
在java.lang.ClassLoader.defineClass1(本机方法)
在java.lang.ClassLoader.defineClass(ClassLoader.java:760)
在java.lang.ClassLoader.defineClass(ClassLoader.java:642)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:497)
在javassist.ClassPool.toClass2(ClassPool.java:1133)
在javassist.ClassPool.toClass(ClassPool.java:1114)
...另外10个
我尝试使用
pool.importPackage()
,但无济于事。 最佳答案
您遇到的问题与程序包专用程序包的运行时定义有关。
Javassist无法将类注入到负责Swing的引导类加载器中。相反,它将更改后的类注入到系统类路径中。该加载的类继承自package-private类,但该类由引导类加载器“自然”加载。根据定义,此程序包是一个不同的运行时程序包,因此无法由其实现类访问,从而导致非法访问错误。