我写了下面的代码来应对编码挑战。这个程序的目的是连接到另一个java进程,并在程序启动后加载一个指令引擎。这通常是在Java中通过在你的代理jar文件中实现一个agentmain方法来完成的。我在下面的代码中生成了这一切:这个错误出现在运行toy程序的JVM上,提示是由于某种原因,它认为Agent类文件名是Agent$1。我注解掉了ByteBuddy的用法,并尝试使用内置库加载代理文件,但仍然失败。第一个有人知道我做错了什么吗?
dw1jzc5e1#
对于generateSimpleAgent2(),它是有效的。它不会以同样的方式失败,就像你在 ewramner 的答案下的评论中所说的那样。这应该给予你一个线索。此外,如果你只是阅读了异常并相信它告诉你的,你就知道该怎么做了。再次强调:
generateSimpleAgent2()
java.lang.ClassNotFoundException: Agent$1
也就是说,generateSimpleAgent()创建了两个类文件,一个用于代理本身,一个用于它的匿名类。这正是 javac 应该做的。只要检查输出目录,您就会看到它。只需将缺少的类文件添加到JAR中,就可以了:
generateSimpleAgent()
runCommand("jar -cfm agent.jar manifest.mf Agent.class Agent$1.class Transformer.class");
现在,带有匿名转换器类的代理也可以工作了。
hkmswyz62#
Agent$1是一个匿名类,因此它必须是您在此处创建的类:
Agent$1
new ClassFileTransformer() { ... }
至于为什么找不到它,你怎么修复它我不知道,也许你可以在引用它之前为它生成一个真实的的命名类?
2条答案
按热度按时间dw1jzc5e1#
对于
generateSimpleAgent2()
,它是有效的。它不会以同样的方式失败,就像你在 ewramner 的答案下的评论中所说的那样。这应该给予你一个线索。此外,如果你只是阅读了异常并相信它告诉你的,你就知道该怎么做了。再次强调:也就是说,
generateSimpleAgent()
创建了两个类文件,一个用于代理本身,一个用于它的匿名类。这正是 javac 应该做的。只要检查输出目录,您就会看到它。只需将缺少的类文件添加到JAR中,就可以了:现在,带有匿名转换器类的代理也可以工作了。
hkmswyz62#
Agent$1
是一个匿名类,因此它必须是您在此处创建的类:至于为什么找不到它,你怎么修复它我不知道,也许你可以在引用它之前为它生成一个真实的的命名类?