import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.matcher.ElementMatchers;
import java.lang.instrument.Instrumentation;
public class SimpleTestAgent {
public static void premain(String arg, Instrumentation inst) {
new AgentBuilder.Default()
.type(ElementMatchers.isAnnotatedWith(SomeAnnotationType.class))
.transform((builder, type, classLoader, javaModule) -> {
try {
Class loadedClass = Class.forName(type.getName(), true, classLoader);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return builder;
})
.installOn(inst);
}
}
线程“main”java.lang.LinkageError:loader(sun/misc/launcher$AppClassLoader的实例):试图重复名称:“TestClass”的类定义
public class AgentTest {
public static void main (String[] args) {
TestClass pet = new TestClass();
}
}
我正在尝试实现代理,如:easly-create-java-agents-with-bytebuddy中描述的示例所示
是否有一种方法可以加载Class对象而不导致此问题,或者使用传递给transformation()方法的参数访问注释?
for (Class<?> t : inst.getAllLoadedClasses()) {
System.out.println("Class name: " + t.getName());
}
使用传递给transform()方法的net.bytebuddy.description.type.TypeDescription实例,可以获得关于类的注释和完整信息。
问题是,例如,我需要可以使用反射调用的方法对象。如果我能以某种方式访问正在转换的类的Class对象,那就更容易了。
Byte Buddy已经通过TypeDescription
API公开了关于类注释的所有信息,您不应该像在转换期间加载的类那样加载类,在应用转换之前加载该类,并以您观察到的错误中止类加载。相反,实现您自己的匹配器:
.type(type -> check(type.getDeclaredAnnotations().ofType(SomeAnnotation.class).load())
Byte Buddy将在不加载carrier类本身的情况下为您表示注释,而是使用它自己的类文件处理器来表示注释。
您应该确保在安装代理生成器之前加载了注释类,以避免此精确注释的循环。
我正在用bytebuddyapi编写一个Java代理。因此,我想了解使用Bytebuddy DSL的重传功能加载的类的方法委派。当我使用参数javaagent启动应用程序时,一切正常,控制台输出也会更改,但当在运行时附加java代理时,会执行agentmain方法,但控制台输出不会更改。也许我错过了一些进一步的ByteBuddy配置。任何帮助都将不胜感激! 这是代理代码: 以下是应用程序代码: 这
我有很多Web服务在普通JDK上运行,我需要截取所有公共方法来做一些事情。有些方法正在使用@WebParam注释。用ByteBuddy子类化WebService会从覆盖方法中删除@WebParam注释,服务不再按预期工作。 这是签名样本 下面是我如何使用ByteBuddy 我知道有一种注释参数的方法,但是它需要关于方法参数的特殊知识(因为只有一些参数被注释)。我想做的只是要求ByteBuddy以与
我正在尝试在项目中检测一些类。当我将代理类打包到jar中并通过-javaagent使用它时,它工作正常。 当我尝试直接在项目中运行它时,检测有时会失败。(我在测试类的静态块中初始化bytepal)。 例如,当我添加这个测试时,我的代码不再被截获。用try/catch做同样的事情是有效的。 有没有一种安全的方法来仪器类在同一个项目没有-javaagent? 项目在OpenJdk11上。
字节伙伴代理是否能够克服附加API限制,例如“新方法定义”、“静态变量更改”?我可以看到,正在从代理生成器调用重定义类方法,但不确定这是否也遵循与附加API相同的限制。 我试图了解我是否可以做到以下几点: 1) 使用应用程序类加载器加载代理jar,例如并行WebAppClassLoader。我的应用程序是一个servlet webapp,在运行时它使用上面的类加载器加载所有应用程序类。 2) 完全
我有下面的课程。两个注释(AnnotA和AnnotB),一个类的子类。java'(带@AnnotA)及其“父”基。java'(带有@AnnotB)。 编译子对象时。java,我的注释处理器报告AnnotA,但它不报告在Base中找到的注释(AnnotB)。JAVA 安诺塔。JAVA 阿诺特。JAVA 基础JAVA 小孩JAVA MyProc。JAVA 这是编译过程及其输出,正如您所看到的,没有关于
我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?