我正在尝试使用 javassist 加载特定的类,我在预主方法中执行此操作,如下所示:
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
{
byte[] byteCode = classfileBuffer;
if(className.toLowerCase().endsWith("class1"))
{
ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.get("com.class2");
}
}
但不幸的是,我收到了 NotFoundException...
com.class2 是类加载器在加载 class1 后将加载的类,但我想为 class1 添加一个新方法,该方法的返回类型为 com.class2
我尝试了 stackoverflow.com 内的所有解决方案,但没有任何结果......
最后,class1和class2都在同一个包中,并且在同一个JAR文件中,class1有一个class2类型的成员,但我不知道为什么这个类池无法加载第二个。
堆栈跟踪在这里:
Exception: javassist.NotFoundException: com.Class2
javassist.NotFoundException: com.Class2
at javassist.ClassPool.get(ClassPool.java:439)
at javassist.ClassPool.getCtClass(ClassPool.java:504)
at com.stuff.MainAppletTransformer.transform(MainAppletTransformer.java:69)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.defineClassHelper(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.access$100(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
您的方法没有返回值,因此无法编译。不过,我仍然可以看出出了什么问题:您没有设置正确的搜索路径。从您的堆栈跟踪来看,您似乎正在运行一个由特定的小程序屏蔽的小程序ClassLoader
。在当前版本中,该类加载器对于 Javassist 不可见。
通过使用ClassPool.getDefault()
, 你是从系统类路径查找信息 http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/html/javassist/ClassPool.html#getDefault%28%29。对于您的小程序,您可能需要添加类加载器 http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/html/javassist/ClassPath.html由转换方法作为参数传递。
您可以将类加载器附加到 Javassist 的搜索路径中:
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath(new LoaderClassPath(classLoader));
添加此路径后,您的示例应该可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)