使用Javassist编辑JFrame类时出现IllegalAccessError

时间:2015-05-24 19:25:19

标签: java bytecode javassist

我正在使用Javassist在运行时编辑JFrame类,(添加一个新的构造函数)

 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

  

线程中的异常“main”javassist.CannotCompileException:by java.lang.IllegalAccessError:class javax.swing.JFrame无法访问其超接口javax.swing.TransferHandler $ HasGetTransferHandler           at javassist.ClassPool.toClass(ClassPool.java:1120)           at javassist.ClassPool.toClass(ClassPool.java:1063)           at javassist.ClassPool.toClass(ClassPool.java:1021)           at 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           at java.lang.ClassLoader.defineClass1(Native Method)           at java.lang.ClassLoader.defineClass(ClassLoader.java:760)           at java.lang.ClassLoader.defineClass(ClassLoader.java:642)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           在java.lang.reflect.Method.invoke(Method.java:497)           at javassist.ClassPool.toClass2(ClassPool.java:1133)           at javassist.ClassPool.toClass(ClassPool.java:1114)           ......还有10个

我尝试使用pool.importPackage(),但无济于事。

1 个答案:

答案 0 :(得分:1)

您遇到的问题与package-private软件包的运行时定义有关。

Javassist不能将类注入到负责Swing的引导类加载器中。相反,它会将更改后的类注入系统类路径。这个加载的类继承自package-private类,但是由bootstrap类加载器“自然地”加载。根据定义,此包是一个不同的运行时包,因此不能被其实现类访问,从而导致非法访问错误。