问题标签 [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.

0 投票
1 回答
302 浏览

java - 使用 JavaAssist 修改现有类时出错

我正在处理以下 CodeWars 挑战:

https://www.codewars.com/kata/hack-22/train/java

这是我写的:

我收到以下错误:

线程“主”javassist.CannotCompileException 中的异常:由 java.lang.ClassFormatError:类 SaneYossarian 覆盖最终方法 isCrazy.()Z

这没有任何意义!我使用 JavaAssist 正是为了修改原始类。我不是在寻找挑战的解决方案,只是了解我在修改课程的步骤中做错了什么。任何帮助表示赞赏。

更新:我也尝试直接修改基类中的方法返回true,

0 投票
2 回答
509 浏览

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(因此它不适用于现代硬件)。

那么,有没有办法做到这一点?

...

底线:我想要这样做的原因是在我的应用程序中跟踪特定的方法调用,就像调用此方法时(并在它之前执行一些操作)以及仅当此方法退出时(并对它执行一些操作)。这些方法是在运行时定义的,因此无法在编译时提前知道它们。

0 投票
1 回答
146 浏览

java - 使用 javassist 更改代码无效 (MethodCall)

我有这个简单的功能:

我有这个测试功能:

我希望输出是1, 2, 3, 4, 5, 6

现在我呼吁instrument哪个CtMethod工作正常。

但最终所有的转换都没有任何效果。我不知道该怎么做,因为那里的信息太少了。

这是完整的代码:

0 投票
4 回答
217 浏览

java - 如何装饰现有 Java 对象的方法?

编辑:我在https://stackoverflow.com/a/60235242/3236516描述了我们的解决方案

我有一个 java 对象。它是扩展抽象类的许多子类之一的实例。我想修改它的一种方法,以便在调用原始方法之前运行一些额外的代码。我的目标在概念上与 AspectJ 中的切入点相同。

如果我创建原始对象的一些修改版本而不是改变原始对象,那很好。如果解决方案涉及字节码操作,也可以。

前期工作

我考虑过通过 JavaAssist 创建代理。麻烦的是,ProxyFactory 的 create 方法要求我提前知道构造函数的输入类型。我不。我可以在不通过 Objenesis 调用构造函数的情况下创建我的对象,但是生成的代理对象对于构造函数设置的任何值都将具有空值。这意味着只要直接引用构造函数设置的值,我生成的对象的行为就会与原始对象不同。

语境

我们通过 AWS Kinesis Data Analytics 使用 Flink 来转换一些流数据。我们希望在所有StreamOperator 的open() 方法的开头包含一些通用代码,而无需修改每个运算符。一个用例是确保自定义指标代理在操作员运行的每个实例上运行。

0 投票
1 回答
106 浏览

java - 我在运行时向方法添加了预定义的注释,我希望更改是永久性的吗?

所以,假设我有一个类 Person 并且我想在运行时将 Myntra 注释添加到 getLastName() 方法(我已经使用 Javassist 库完成了)

但我希望更改是永久性的,以便下次运行时注释应该在那里!

我怎样才能做到这一点?

这就是我使用 javassist lib 的方式

这是我的 Myntra 注释

注意: Jabong 和 xyz 也是类似于 Myntra 的注释,但与我的问题无关。

这就是我的 main() 函数的样子——> 我在这里向 getLastName() 方法添加一个新的 Myntra 注释,然后使用 java 反射打印所有具有 Myntra 注释的方法。

所以它在运行时工作正常-> 输出是:

但我希望添加到 getLastName() 方法的注释是永久的。我不确定它是否可能?如果是--> 请告诉我该怎么做!

0 投票
0 回答
52 浏览

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

  1. 反射 - 当你在同一个 JVM 上时可以使用,不确定它是否适用于不同的 JVM。

    欣赏建议。

0 投票
1 回答
264 浏览

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 类如下:

0 投票
1 回答
46 浏览

java - Javassist - CtMethod 方法体中的数值操作抛出 java.lang.VerifyError

请参阅下面使用 javassist 创建类和方法的代码:

调用此方法后,我收到错误:

线程“主”java.lang.VerifyError 中的异常:(类:公式,方法:公式 1 签名:(Lcom/formulabuilder/FormulaAPI;)Ljava/lang/Double;)函数中的返回类型错误

Javassist 不支持方法体中的数字运算吗?我正在尝试调用一个方法并在它返回值之前添加一个数字,如下所示:

如何在方法体中实现 +、*、/、<、<= 等数字运算?

0 投票
0 回答
44 浏览

java - 尝试使用字符串和对象数组作为输入参数创建方法时出现 Javassist.CannotCompileException

我需要使用 JavaAssist CtMethod 创建一个方法。此方法需要接受一个字符串和一个对象数组作为输入参数,如下所示

lp列表在哪里

但是当我创建方法时出现异常:

知道为什么 javaassist 会抛出此异常吗?

我实际上想将整个lp对象作为参数传递给方法,但是在上面的代码中,我试图查看如果我只传递列表中的一个条目,JavaAssist 是否会接受

知道为什么 javaassist 会抛出此异常吗?

0 投票
1 回答
69 浏览

java - 如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?

我无法获得正确的方法。很少得到适当的少数不是。

1)什么是错误?
2) 在getLineNumber(int offset)中如何计算偏移量?