问题标签 [javaagents]

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 回答
482 浏览

java - Java 代理有哪些有趣的用途?

从 Java 5 开始,可以选择将 Java 代理添加到类加载器。

你写过代理吗?你用过代理吗?代理有什么有趣的用途?

0 投票
1 回答
2028 浏览

debugging - 调试器不适用于 JMockit

希望这里有一个简单的问题......

我正在使用 RAD 7.5.2,并且正在编写 Junit 测试。我用 JUnit 3 写得很好,然后我想模拟一些函数调用。所以我加载了 jmockit 0.9.7 和 Junit 4.6。我还包括 -javaagent:jmockit.jar 作为 VM 参数。

当我“运行为 Junit 测试”时,它完全没有问题(至少,我在输出中看不到任何问题)。Junit 的输出很好,没有错误转储到控制台。

当我“调试为 Junit 测试”时,它不起作用。它让我陷入:

InstrumentationImpl.class --> 找不到源

......当我点击继续......

NativeMethodAccessorImpl.class --> 找不到源

...当我点击继续...

JUnit 在此之后结束。它将以下内容转储到控制台:


在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl) 的线程“main”java.lang.reflect.InvocationTargetException 中的异常.java:43) at java.lang.reflect.Method.invoke(Method.java:618) at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:160) 原因:java.lang.UnsatisfiedLinkError: sun/instrument/ InstrumentationImpl.redefineClasses0([Ljava/lang/instrument/ClassDefinition;)V at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:98) at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:197) at mockit.internal。重新定义引擎。在 mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:116) 在 mockit.internal.RedefinitionEngine.setUpInternalStartupMock(RedefinitionEngine.java:53) 在 mockit.internal.Startup.loadInternalStartupMocks(Startup.java) 的 redefineMethods(RedefinitionEngine.java:184) :123) 在 mockit.internal.Startup.initialize(Startup.java:110) 在 mockit.internal.Startup.premain(Startup.java:97) ... 还有 5 个

致命错误:处理 -javaagent 失败


我可以毫无问题地在我的测试上运行 JUnit 3 和 JUnit 4,当我使用 -javaagent:jmockit.jar (使用调试器;它们本身很好)时,事情变得丑陋,我必须这样做使用 jmockit 的东西。

想法?

0 投票
4 回答
51777 浏览

jvm - 如何使用多个 Java 代理启动我的 Java 程序?

我知道如何使用 java 代理启动 java 程序:

但是如果我想添加 2 个或更多 Java 代理来检测我的程序怎么办?我不想为必须在 JVM 中加载的每个代理重新调用 java -javaagent:...。

我试过这样的事情:

或类似的东西:

但是没有成功。

有解决我问题的答案吗?

谢谢你。

0 投票
4 回答
2288 浏览

java - Javaagent 类卸载

我有一个检测字节码的 java 代理。我正在使用 java 6 中的附加 api 来允许用户使用我的 java 代理动态加载代理和仪器以及 deinstrument 代码。我正在使用 Boot-Class-Path 清单属性来确保我的 javagent 类位于引导类路径中,以便我的用户可以检测 ArrayList 等类。

但是,问题来自版本控制。假设用户动态附加了我的代理的版本 1。然后我给了他第 2 版。现在,自从他附加了我的代理的第 1 版后,他的应用服务器从未关闭过,所以第 1 版的类仍在加载。

我需要一些方法,以便当我的 javaagent 客户端版本 2 时,版本 1 被卸载。

我知道一种方法是为我的 javaagent 的类编写一个客户类加载器,并将类加载器引用设置为 null。但是在这种情况下,我将无法在引导类路径中检测类,因为我的类加载器将位于引导类加载器的层次结构中,因此我的用户无法检测像 ArrayList 这样的类,因为如果我在 ArrayList 的方法中添加一个调用到我的一个代理类的方法,引导类加载器将无法看到它们。

那么有什么办法可以解决引导类路径问题,并且仍然卸载以前代理的类吗?

0 投票
4 回答
18693 浏览

java - 程序启动后启动 Java 代理

是否可以在虚拟机从同一 VM 内启动后插入 javaagent?

例如,我们在 jar myagent.jar 中有一个代理,它具有适当的元数据设置和一个已经实现的 agentmain 方法。现在用户程序调用一个 API 调用,这应该会导致代理的插入,以便它可以重新定义类。

可以做到吗?怎么做?

0 投票
1 回答
560 浏览

c# - 相当于 C# 中的 -javaagent?或者:在 C# 中使用 java 框架的方法

这可能是我应该能够自己弄清楚的事情,但我运气不好,所以我想我会问。

问题:我正在将一个系统从 java 转换为 C#,他们使用了一个我非常想使用的 java 框架,因为它处理了系统中最复杂的部分,否则我必须自己实现这些部分。我有这个框架的源代码。

我知道在 C# 中使用 java 库有多种可能性(尽管我对其中任何一个都不熟悉,所以我很感激建议)。到目前为止,我一直在考虑使用IKVM.NET来生成 .dll,但我不确定下一步该做什么,因为在 java 中,为了使用您的代码运行框架,您应该使用选项 -javaagent通过添加

-javaagent:bin/deuceAgent.jardeuceAgent框架在哪里)

到你的java命令行。我不知道拥有 .dll 后 C# 中的等价物是什么,或者根本不知道是否有等价物。

有什么帮助吗?非常感谢。

0 投票
1 回答
1721 浏览

java - java 代理是否在单独的线程中运行?

我觉得这是我应该知道的,但是 java 代理(用 -javaagent 指定)是否在单独的线程中运行?我读过Java 代理是一个可插入的库,它嵌入在 JVM 中运行并拦截类加载过程,但我想确定:它真的拦截了它们(听起来像是在另一个线程中运行并监视类加载)还是由 JVM 通知(JVM 调用它来解决类负载;它没有单独的线程)?

再一次,我觉得我应该能够弄清楚,但是对我好一点,我工作太努力了,我的大脑有点炸了:P

谢谢!

0 投票
1 回答
593 浏览

metaprogramming - 使用变形代码减少样板文件

有没有人见过变质代码——即生成和运行指令的代码(包括 IL 和 Java 字节码,以及本机代码)——用于减少样板代码?

无论应用程序或语言如何,通常都有一些数据库代码来从数据库中获取行并返回对象列表。当然,根据您的数据库连接器,有无数种方法可以做到这一点。您最终可能会按索引访问行的单元格(很尴尬,因为将“SELECT Name, Age”更改为“SELECT Age, Name”会破坏您的代码,并且索引会混淆含义),或者使用 myObject.Age = resultRow. getValue("Age") (尴尬,因为这涉及简单地遍历每个字段以根据列设置其数据)。

与数据库主题保持一致,LINQ to SQL 非常棒。但是,定义数据模型就不那么棒了,尤其是当您的数据库有太多表以致 SSMS 无法在对象浏览器中列出所有这些表时。另外,我不喜欢的不是存储过程的编写或 SQL 的参与;只是对象与数据库的连接。

我实习的公司的某个人从我们的 SqlCommand 类(继承自 System 类)中编写了一个非常棒的方法,该方法使用 .NET 反射和 System.Reflection.Emit 来生成一个设置字段的方法(装饰有包含列名称的属性)在具有空构造函数的任何模型对象上。我会考虑这种变形,因为程序的特定部分编写了新方法。

这种从数据库生成对象的模式只是一个例子。两天前我遇到的一个是对 SWT 的数据绑定支持(通过 JFace)。我用 setAddress(Address address) 和 getName() 制作了这些非常干净的模型,现在我必须用 PropertyChangeSupport 发射器污染设置器并携带一个 PropertyChangeSupport 实例(即使它只是在抽象基类中)!然后我找到了 PojoBindables,现在我感觉自己像一个 80 级的数据绑定器,只是因为我需要写的更少。

具体来说,使用本机代码和类似这样的东西或Java 代理的东西会非常好。

0 投票
1 回答
5795 浏览

classloader - how to resolve java result 1 errors

How to resolve 1 particular flavor of 'java result 1' in the context of using JVMTI agents?

0 投票
1 回答
1915 浏览

java - 使用 -javaagent 而不将代理打包到 jar 中

是否可以在java -javaagent:myagent.jar some.package.Main没有将代理打包到 jar 的情况下运行?就像是java agent.MyAgent some.package.Main

我有一个代理的源代码,希望能够对其进行调试,然后再对其进行更改,因此根本不需要使用它-javaagent,而是选择some.package.Main通过 GUI 执行。

BTrace能够使用 PID 连接到正在运行的进程或使用-javaagent. 我正在寻找类似于第一种方法的东西(使用 PID),但是我也可以从头开始一个过程。