引用ByteBuddy AgentBuilder中动态添加的方法
Referring to a dynamically added method in ByteBuddy AgentBuilder
我想使用字节好友实现以下场景
- 在抽象中定义一个新的构造函数class
- 在调用 #1 的子类型中创建一个新方法
然而,我运行遇到一个问题,即#2 的转换器无法找到#1 中定义的方法。
更详细的设置说明如下:
我有 classes Base
和 A
public abstract class Base {
protected Base() {}
protected Base(String s, Object o) {...}
}
public abstract class A {
protected A() {}
}
我想给 A
添加另一个构造函数,等同于
protected A(String s, Integer i) {
super(s, i);
}
所以我写了
new AgentBuilder.Default().type(named("A"))
.transform((builder, typeDescription, classLoader, module) ->
builder.defineConstructor(Visibility.PROTECTED)
.withParameter(String.class)
.withParameter(Integer.class)
.intercept(
MethodCall.invoke(isConstructor().and(takesArguments(String.class, Object.class)))
.withArgument(0, 1)))
.installOn(instrumentation);
如果我 运行 我的代码使用此代理,我能够看到在 运行 时添加的新构造函数。
现在我想在另一个 class B
.
中引用这个新添加的构造函数
public class B extends A {
// I want to add this method
newMethod() {
super("str", 0)
}
}
所以我写了
new AgentBuilder.Default().type(isSubTypeOf(A.class)))
.transform((builder, typeDescription, classLoader, module) ->
builder.defineMethod("newMethod", typeDescription, Visibility.PUBLIC)
.intercept(
MethodCall.invoke(isConstructor().and(takesArguments(String.class, Integer.class)))
.with("str")
.with(0)))
.installOn(instrumentation);
但是,我收到如下错误
java.lang.IllegalStateException: class B does not define exactly one virtual method or constructor for (isConstructor() and hasParameter(hasTypes(erasures(containing(is(class String), is(class Integer)))))) but contained 0 candidates: []
我可以不引用我在以前的转换器中添加的方法吗? (首次使用 ByteBuddy 用户)
问题是另一个 class 需要从 class 路径定位,其中存储的 class 文件以旧格式表示。与其使用隐式浏览层次结构的匹配器,不如显式提供方法,例如使用 MethodDescription.Latent
.
我想使用字节好友实现以下场景
- 在抽象中定义一个新的构造函数class
- 在调用 #1 的子类型中创建一个新方法 然而,我运行遇到一个问题,即#2 的转换器无法找到#1 中定义的方法。
更详细的设置说明如下:
我有 classes Base
和 A
public abstract class Base {
protected Base() {}
protected Base(String s, Object o) {...}
}
public abstract class A {
protected A() {}
}
我想给 A
添加另一个构造函数,等同于
protected A(String s, Integer i) {
super(s, i);
}
所以我写了
new AgentBuilder.Default().type(named("A"))
.transform((builder, typeDescription, classLoader, module) ->
builder.defineConstructor(Visibility.PROTECTED)
.withParameter(String.class)
.withParameter(Integer.class)
.intercept(
MethodCall.invoke(isConstructor().and(takesArguments(String.class, Object.class)))
.withArgument(0, 1)))
.installOn(instrumentation);
如果我 运行 我的代码使用此代理,我能够看到在 运行 时添加的新构造函数。
现在我想在另一个 class B
.
public class B extends A {
// I want to add this method
newMethod() {
super("str", 0)
}
}
所以我写了
new AgentBuilder.Default().type(isSubTypeOf(A.class)))
.transform((builder, typeDescription, classLoader, module) ->
builder.defineMethod("newMethod", typeDescription, Visibility.PUBLIC)
.intercept(
MethodCall.invoke(isConstructor().and(takesArguments(String.class, Integer.class)))
.with("str")
.with(0)))
.installOn(instrumentation);
但是,我收到如下错误
java.lang.IllegalStateException: class B does not define exactly one virtual method or constructor for (isConstructor() and hasParameter(hasTypes(erasures(containing(is(class String), is(class Integer)))))) but contained 0 candidates: []
我可以不引用我在以前的转换器中添加的方法吗? (首次使用 ByteBuddy 用户)
问题是另一个 class 需要从 class 路径定位,其中存储的 class 文件以旧格式表示。与其使用隐式浏览层次结构的匹配器,不如显式提供方法,例如使用 MethodDescription.Latent
.