问题标签 [javassist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
osgi - 我已经在类路径中添加了 tools.jar,为什么仍然抛出 java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap?
我正在使用javassist的 HotSwap 功能,它需要类路径中的 tools.jar,所以我-cp tools.jar
在启动我的 OSGi 应用程序时添加了。但是当我new HotSwap()
在其中一个包的代码中时,
被抛出。com.sun.jdi.Bootstrap
在 tools.jar 中,我已经将它添加到类路径中,并且我验证了它是否有效,因为如果没有,以下代码将不起作用:
HotSwapper 的 Classloader 无法加载类com.sun.jdi.Bootstrap
?那为什么它在我的 Eclipse 环境中正常工作?(我将 tools.jar 添加到构建路径的库中)
关于为什么 NoClassDefFoundError,任何线索都值得赞赏。
java - 如何在使用 javaassist 创建 .class 文件时向方法添加 @Override 注释?
如何在@Override
使用 javaassist 创建类时向方法添加注释?
此代码抛出异常如下:
osgi - 如何在使用 javaassist 生成的类文件中使用服务
我可以在使用 javaassist 生成的类文件中使用服务吗?我怎样才能做到这一点?由于这个类是动态创建的,我如何注册这个类正在使用另一个类提供的服务?
java - Javassist 强制转换和连接问题
我需要实例化一个作为字符串传递的函数,并且我为“函数”对象编写了一个包装器,让我在定义函数后执行该函数。
包装器使用 JavaAssist 库,使用对象和方法作为包装器对象的字段,以及让我在包装器类之外使用函数的方法。
我的麻烦在于函数体语法,我有很多
java.lang.VerifyError: (class: MyClass, method: myMethod signature: (*my signature, unimportant *) Expecting to find *a primitive type* on stack
与即时演员表相关,例如
我解决了(不是很好的解决方案,但它正在工作)避免那些强制转换并总是实例化定义类型的变量
现在我有另一个问题,它让我发疯:这是字符串的内容
t2.getClass() 和 t3.getClass() 返回 java.lang.Double 但 mysum 是 t2 和 t3 的串联,而不是算术和......这怎么可能?
java - 如何使用 classLoader 动态加载类
我在光盘中有一个 .class 文件。我想使用 javaassist 将它动态加载到 jvm 上。但它抛出异常。以下是我写的代码:
D: 驱动器上有一个 .class 文件,并且它抛出以下异常:
如何将光盘上的.class文件动态加载到jvm上并执行???
java - 在运行时替换某些方法的内容
我想在运行时替换一些方法的内容。
我知道我可以为此使用javassist,但它不起作用,因为我想增强的类已经由系统classLoader加载。
如何在运行时替换方法的内容?我应该尝试卸载课程吗?我怎样才能做到这一点 ?我看到这是可能的,但我不知道该怎么做。
如果可能的话,我想避免为此使用外部库,我想自己编写代码。
更多信息: - 我要增强的类包含在一个框架中(在一个 jar 文件中) - 我的代码实际上是这个框架的一个插件 - 我的插件运行的框架有它自己的classLoader,但是这个classLoader没有加载自己的类(它将它们委托给系统类加载器) - 我使用的框架是Play。
谢谢您的帮助 !
reflection - 使用 javassist 添加注释会删除以前的代码
我正在尝试在加载类时向它们添加一些注释。
为此,我编写了一个 java 代理转换器,它在加载时获取类字节码并可以更改它。当我运行以下代码时,新的注释出现在类上,但所有以前的注释和字段/方法都被删除了。
其中 classFileBuffer 是返回给类加载器的字节数组。如果有人知道为什么要删除以前的类注释和代码,那将非常有帮助。
谢谢,
阿夫纳
java - 向 Java 类添加字段
研究了在运行时使用 CGLib、ASM、BCEL(方面)和 Javassist 向类添加字段....
只是为了让我直截了当,看起来这些字节码操纵器不会更新实际的类,而是允许用户只转储修改(如使用 CGLib 和 writeFile 方法)。希望我能找到一个解决方案,(a)加载类(而不是使用 BCEL 执行 InputStream)和(b)更新类。
也许这很正常?人们通常会创建代理并传递代理吗?
我想要做的是在将对象传递给查找具有特定注释的字段(而不是属性)的框架之前添加一个字段(注意:不是通过 get/set 方法的属性)。所以“客户”正在创建我想要注入额外字段的目标类。使用 AOP 拦截对我想要操作这些对象的服务层的调用。
assert - Javassist:生成“断言”语句
我尝试在方法中添加“断言”语句。
但我得到了这个例外:
引起:编译错误:在 javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681) 在 javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716) 的 mypackage.MyClassThatIsInstrumented 中找不到 assert(boolean) 在 javassist.compiler .JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156) 在 javassist.compiler.ast.CallExpr.accept(CallExpr.java:45) 在 javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241) 在 javassist.compiler.CodeGen。 atStmnt(CodeGen.java:329) 在 javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) 在 javassist.compiler.CodeGen.atStmnt(CodeGen.java:350) 在 javassist.compiler.ast.Stmnt.accept (Stmnt.java:49) 在 javassist.compiler.CodeGen.atMethodBody(CodeGen.java:291) 在 javassist.compiler.Javac.compileBody(Javac.java:222) 在 javassist.CtBehavior.setBody(CtBehavior.java:360) ... 30 更多
任何想法如何解决这个问题?
java - 了解 Javassist 中的常量池
我正在使用 Javassist 在运行时扩展某些类。在几个地方(在生成代码中),我需要创建 JavassistConstPool
类的实例。例如,要将生成的类标记为synthetic
,我写了如下内容:
这按预期工作,但我对这是否完全正确有一定的怀疑。具体来说,我的主要问题是:
在这个例子中调用CtClass.getClassFile().getConstPool()
了获取常量池的正确方法吗?如果不是,那么在运行时使用 Javassist 创建新类时,获取正确的常量池实例的一般正确方法是什么?
另外,我对幕后发生的事情有点迷茫:为什么我们需要一个常量池来创建合成属性的实例?或者一般来说,任何其他类型的类属性?
感谢您的任何澄清。