5

我正在编写另一个大型 java 程序的插件。

我想在运行时修改java程序的一些java方法的一些字节码,以便拦截方法调用(即在方法中注入一些钩子代码)。

有什么办法可以做到这一点?

PS:

我检查了以下方法:

1.更改java程序的类加载器。(我们不能改变它)
2.使用 java 代理。(我们不能使用 java 代理,因为 java 代理会创建一个新的代理对象。我们不使用代理对象。我们需要挂钩 java 程序的对象,并使用该对象)
3. 使用 -javaagent 选项(我们不能添加java 程序的命令行选项。)

PS 更多[再次编辑]
我的类是由 ext 类加载器加载的(我将 jar 文件放在 JAVA_HOME\lib\ext 文件夹中)。大型java程序是Browser加载的applet程序。当浏览器启动小程序时,它也会加载我的类。

PS more more [再次编辑]
虽然它在 Applet 中运行。我可以得到完全的许可。因为我可以修改 java.policy 和 java.security 文件。

谢谢,
卡尔文

4

4 回答 4

6

只需使用 -javaagent opiton,它用于在运行时修改字节码。您可以从此链接此链接中找到有关 -javaagent 的更多信息

于 2013-10-09T09:59:50.253 回答
2

您可以使用几个库。例如,请参见此处。但是,一旦 VM 已经加载/初始化了一个类,就无法对其进行操作。

顺便说一句,原则上你也可以用你自己的代理类文件替换要“挂钩”的类。只要类的可见界面没有改变,这可能会起作用。(虽然类的子类在运行时可能会严重失败。)这种替换可以像更改类路径一样简单,以便首先找到同名的类,然后再找到原始类。在这种情况下,委托给同名的原始类可能会稍微复杂一些。

于 2013-10-09T09:35:25.890 回答
1

是的,你可以,但是这个过程会有点棘手,因为你会直接使用内存进行操作。为此,您将查看有关 sun.misc 包及其 Unsafe 类的非官方文档。

  • 警告 1:根据官方消息,在 JDK 9 中将删除 Unsafe 类。
  • 警告 2:Sun 公司不会对您的代码正常工作负责,因为这个类根本不应该被使用,并且只为系统使用而存在。
于 2017-02-24T12:38:13.917 回答
0

抱歉,这是不可能的。首先,字节码在类加载后是不可变的。JVM 提供了几个 API 可用于执行此类操作,但它们显然具有很高的特权。

如果您在浏览器 Applet 之类的低权限环境中运行,那么您显然不会被允许这样做,并且任何可能的方法都应该被视为安全漏洞。

但问题是您为什么首先使用小程序,以及为什么要在加载后修改代码。几乎可以肯定,有更好的方法来做你想做的事情。

于 2013-10-09T13:29:35.553 回答