问题标签 [java-assist]
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.
java - 使用 JavaAssist 修改现有类时出错
我正在处理以下 CodeWars 挑战:
https://www.codewars.com/kata/hack-22/train/java
这是我写的:
我收到以下错误:
线程“主”javassist.CannotCompileException 中的异常:由 java.lang.ClassFormatError:类 SaneYossarian 覆盖最终方法 isCrazy.()Z
这没有任何意义!我使用 JavaAssist 正是为了修改原始类。我不是在寻找挑战的解决方案,只是了解我在修改课程的步骤中做错了什么。任何帮助表示赞赏。
更新:我也尝试直接修改基类中的方法返回true,
android - Android下如何交换方法体
在纯 Java 中,使用 intrumentation 和 java 代理,有一种方法可以在运行时替换方法体。
不幸java.lang.instrument.Instrumentation
的是,在 Android 下不可用。
我已经检查了所有其他替代方案,例如stackoverflow中描述的替代方案,它指向过时的javassist-android实现。这令人惊讶地有效,但仅适用于新课程。
还有一篇名为Hot swapping code in Android的文章描述了如何在运行时再次加载类,而不是如何替换现有的类方法。
唯一涉及此问题的文章是一篇名为Android hacking: Replace system classes methods with your own的文章,该文章遗漏了源代码并引用了 Dalvik,而不是 ART(因此它不适用于现代硬件)。
那么,有没有办法做到这一点?
...
底线:我想要这样做的原因是在我的应用程序中跟踪特定的方法调用,就像调用此方法时(并在它之前执行一些操作)以及仅当此方法退出时(并对它执行一些操作)。这些方法是在运行时定义的,因此无法在编译时提前知道它们。
java - 使用 javassist 更改代码无效 (MethodCall)
我有这个简单的功能:
我有这个测试功能:
我希望输出是1, 2, 3, 4, 5, 6
;
现在我呼吁instrument
哪个CtMethod
工作正常。
但最终所有的转换都没有任何效果。我不知道该怎么做,因为那里的信息太少了。
这是完整的代码:
java - 如何装饰现有 Java 对象的方法?
编辑:我在https://stackoverflow.com/a/60235242/3236516描述了我们的解决方案
我有一个 java 对象。它是扩展抽象类的许多子类之一的实例。我想修改它的一种方法,以便在调用原始方法之前运行一些额外的代码。我的目标在概念上与 AspectJ 中的切入点相同。
如果我创建原始对象的一些修改版本而不是改变原始对象,那很好。如果解决方案涉及字节码操作,也可以。
前期工作
我考虑过通过 JavaAssist 创建代理。麻烦的是,ProxyFactory 的 create 方法要求我提前知道构造函数的输入类型。我不。我可以在不通过 Objenesis 调用构造函数的情况下创建我的对象,但是生成的代理对象对于构造函数设置的任何值都将具有空值。这意味着只要直接引用构造函数设置的值,我生成的对象的行为就会与原始对象不同。
语境
我们通过 AWS Kinesis Data Analytics 使用 Flink 来转换一些流数据。我们希望在所有StreamOperator 的open() 方法的开头包含一些通用代码,而无需修改每个运算符。一个用例是确保自定义指标代理在操作员运行的每个实例上运行。
java - 我在运行时向方法添加了预定义的注释,我希望更改是永久性的吗?
所以,假设我有一个类 Person 并且我想在运行时将 Myntra 注释添加到 getLastName() 方法(我已经使用 Javassist 库完成了)
但我希望更改是永久性的,以便下次运行时注释应该在那里!
我怎样才能做到这一点?
这就是我使用 javassist lib 的方式
这是我的 Myntra 注释
注意: Jabong 和 xyz 也是类似于 Myntra 的注释,但与我的问题无关。
这就是我的 main() 函数的样子——> 我在这里向 getLastName() 方法添加一个新的 Myntra 注释,然后使用 java 反射打印所有具有 Myntra 注释的方法。
所以它在运行时工作正常-> 输出是:
但我希望添加到 getLastName() 方法的注释是永久的。我不确定它是否可能?如果是--> 请告诉我该怎么做!
java - 如何在执行来自不同 JVM 的方法时获得通知并获取参数句柄
有没有办法在调用来自不同 JVM 的方法时得到通知。
开发环境:JDK8、Windows 10(稍后在云上进行部署)。
我有几个 Java 应用程序正在运行,一个在 App Server 中,另一个是独立的批处理。
每当在这些 JVM 中的任何一个上调用核心 java 类方法时,例如 PrintStream.print,我都需要获取输入字符串的句柄并将其记录在其他地方。
我尝试使用 1. Java 字节码操作库,例如 Javassist,使用 Instrumentation 转换字节码,但它只允许处理和操作用户定义的类/第三方库类 - 而不是 java。, 太阳。等等......(即使我们以某种方式这样做,它也会说 - 它违反了 JRE 二进制许可证 - 官方 Javadoc 表示这种检测 rt.jar 类的过程违反了 JRE 二进制代码许可证 - 所以这可能不是继续进行的方法。 https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html)
反射 - 当你在同一个 JVM 上时可以使用,不确定它是否适用于不同的 JVM。
欣赏建议。
java - 在 Javassist 中,使用 CtMethod 创建动态方法时如何将方法的返回类型设置为 java.lang.Double
我必须在运行时动态创建一个类和方法。我为此使用 Javassist:
我要动态创建的方法是:
如果我使用 将上述整个方法作为方法体传递CtMethod.make(..)
,它可以正常工作。
但我想让它更通用,即我只想return api.evaluate(\"L\");
作为我的方法主体,并想使用 JavaAssist API 方法来设置名称、返回类型等。尝试执行此操作时,我收到错误:
我的问题是:调用时: CtMethod m = new CtMethod(...); 如何将 CtMethod 的返回类型设置为 java.lang.Double 而不是 CtPrimitiveType.doubleType ?
我的整个源代码是:
FormulaAPI 类如下:
java - Javassist - CtMethod 方法体中的数值操作抛出 java.lang.VerifyError
请参阅下面使用 javassist 创建类和方法的代码:
调用此方法后,我收到错误:
线程“主”java.lang.VerifyError 中的异常:(类:公式,方法:公式 1 签名:(Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;)函数中的返回类型错误
Javassist 不支持方法体中的数字运算吗?我正在尝试调用一个方法并在它返回值之前添加一个数字,如下所示:
如何在方法体中实现 +、*、/、<、<= 等数字运算?
java - 尝试使用字符串和对象数组作为输入参数创建方法时出现 Javassist.CannotCompileException
我需要使用 JavaAssist CtMethod 创建一个方法。此方法需要接受一个字符串和一个对象数组作为输入参数,如下所示
lp
列表在哪里
但是当我创建方法时出现异常:
知道为什么 javaassist 会抛出此异常吗?
我实际上想将整个lp
对象作为参数传递给方法,但是在上面的代码中,我试图查看如果我只传递列表中的一个条目,JavaAssist 是否会接受
知道为什么 javaassist 会抛出此异常吗?
java - 如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?
我无法获得正确的方法。很少得到适当的少数不是。
1)什么是错误?
2) 在getLineNumber(int offset)中如何计算偏移量?