如何创建一个从注释字段中拦截字段 setter 的 bytebuddy 代理?
How to create a bytebuddy agent that intercepts a field setter from annotated field?
我想做的基本上是将 class 的字段与注释匹配,然后它们拦截该字段的 getter 和 setter。
public class Foo {
@Sensitive
private String Blah;
这是我的代理代码:
private static AgentBuilder createAgent() {
return new AgentBuilder
.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(ElementMatchers.is(FieldTypeMatcher.class).and(ElementMatchers.isAnnotatedWith(Foo.class)))
.transform(((builder, typeDescription, classLoader, module) ->
builder
.method(method -> method.getActualName().contains(typeDescription.getActualName()))
.intercept(Advice.to(Interceptor.class))
));
}
虽然我可以将字段的名称与方法的签名相匹配,但我没有运气。
我假设 Foo
有一个 getter 和 setter 对应 Blah
?
在这种情况下,我推荐自定义 ElementMatcher
实现,例如:
class FieldMatcher implements ElementMatcher<MethodDescription> {
@Override
public boolean matches(MethodDescription target) {
String fieldName;
if (target.getName().startsWith("set") || target.getName().startsWith("get")) {
fieldName = target.substring(3, 4).toLowerCase() + target.substring(4);
} else if (target.getName().startsWith("is")) {
fieldName = target.substring(2, 3).toLowerCase() + target.substring(3);
} else {
return false;
}
target.getDeclaringType()
.getDeclaredFields()
.filter(named)
.getOnly()
.getDeclaredAnnotations()
.isAnnotationPresent(Sensitive.class);
}
}
此匹配器检查方法是 getter 还是 setter,找到相应的字段并检查其上是否存在注释。
我想做的基本上是将 class 的字段与注释匹配,然后它们拦截该字段的 getter 和 setter。
public class Foo {
@Sensitive
private String Blah;
这是我的代理代码:
private static AgentBuilder createAgent() {
return new AgentBuilder
.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(ElementMatchers.is(FieldTypeMatcher.class).and(ElementMatchers.isAnnotatedWith(Foo.class)))
.transform(((builder, typeDescription, classLoader, module) ->
builder
.method(method -> method.getActualName().contains(typeDescription.getActualName()))
.intercept(Advice.to(Interceptor.class))
));
}
虽然我可以将字段的名称与方法的签名相匹配,但我没有运气。
我假设 Foo
有一个 getter 和 setter 对应 Blah
?
在这种情况下,我推荐自定义 ElementMatcher
实现,例如:
class FieldMatcher implements ElementMatcher<MethodDescription> {
@Override
public boolean matches(MethodDescription target) {
String fieldName;
if (target.getName().startsWith("set") || target.getName().startsWith("get")) {
fieldName = target.substring(3, 4).toLowerCase() + target.substring(4);
} else if (target.getName().startsWith("is")) {
fieldName = target.substring(2, 3).toLowerCase() + target.substring(3);
} else {
return false;
}
target.getDeclaringType()
.getDeclaredFields()
.filter(named)
.getOnly()
.getDeclaredAnnotations()
.isAnnotationPresent(Sensitive.class);
}
}
此匹配器检查方法是 getter 还是 setter,找到相应的字段并检查其上是否存在注释。