当前位置: 首页 > 知识库问答 >
问题:

javassist在pre-main方法中加载类文件(java插装)

习华灿
2023-03-14

我试图加载一个特定的类使用javhelp,我这样做内部pre-main方法如下:

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是一个类,在加载类1之后将由类加载器加载,但是我需要为类1添加一个返回类型为2com.class新方法

我尝试了stackoverflow内部的所有解决方案。但是没有任何结果。。。。。

最后,类1和类2都在同一个包中,在同一个JAR文件中,类1有一个类型为类2的成员,但是我不知道为什么这个类池不能加载第二个。

这里的堆栈跟踪:

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)

共有1个答案

黎鹤轩
2023-03-14

您的方法没有返回值,因此无法编译。然而,我仍然可以看出哪里出了问题:您没有设置正确的搜索路径。从堆栈跟踪来看,似乎您正在运行一个小程序,它被特定的类加载器屏蔽。在当前版本中,Javassist看不到此类加载器。

通过使用ClassPool。getDefault(),您正在从系统类路径中查找信息。对于小程序,可能需要添加transformatio方法作为参数移交的类加载器。

您可以通过以下方式将类加载器附加到Javassist的搜索路径:

ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath(new LoaderClassPath(classLoader));

附加此路径后,您的示例应该可以运行。

 类似资料:
  • 版本:3.8.2.201610040743平台:Eclipse Neon.1(4.6.1)这是我的版本插件org.springsource.ide.eclipse.commons.gettingstarted无法加载类org.springsource.ide.eclipse.commons.gettingstarted.dashboard.欢迎仪表板

  • 问题内容: 我是android开发的新手我的日食工作正常。但是现在当我开始一个新项目时,它给出了一个错误问题打开向导无法打开所选向导 详细错误消息是 我也不能运行现有的Android项目。但是我可以启动一个新的Java项目并运行。为什么会这样 问题答案: 如果尚未添加ADT,请执行以下步骤。 帮助->添加新软件->添加。 在选项中写入ADT 如果您已经在计算机中安装了ADT,则在其中添加其路径,例

  • 我的Eclipse停顿了,所以我关闭了它(通常情况下,我没有发送任何kill信号或其他任何东西,编辑器有漏洞,但菜单仍然工作,所以我简单地从菜单中退出它)。 然而,当我重新打开eclipse时,我遇到了一个问题: 插件org.python.pydev无法加载类org.python.pydev.editor.pyedit。 我正在使用Eclipse Kepler Release 2版本ID:2014

  • 我有一个主要的类来测试一些函数,我得到了错误: 警告找不到logger(Jena)的附加程序。 我在网上搜索,我找到了这个解决问题的答案 如果我从bin文件夹中删除该文件,我就会回到第一个问题。

  • 在 Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是 main() 方法。main() 方法和其他的方法有很大的不同。 下面先来看最简单的一个 Java 应用程序 HelloWorld,我们将通过这个例子讲解 Java 类中 main() 方法的奥秘,程序的代码如下: 其中,使用 main() 方法时应该注意如下几点: 访问控制权限是公有的(

  • 问题内容: 我已经看过几次,并尝试了一些建议,但都没有成功(到目前为止)。我在以下路径上有一个maven项目和属性文件: 我正在尝试将其加载到Singleton类中以通过键访问属性 但是我在运行时遇到了NullPointerError的问题。我已经完成了所有可以想到的操作,但是无法找到/加载文件。 有任何想法吗? 堆栈跟踪: 问题答案: 您应该实例化您的对象。另外,您还应该使用以下路径加载资源文件