gpt4 book ai didi

java - Byte Buddy 的调试技术?

转载 作者:行者123 更新时间:2023-12-02 02:12:32 26 4
gpt4 key购买 nike

我正在尝试使用 Byte Buddy 生成一个非常简单的代码.

我有一个 POJO 类,其中一些字段用 @SecureAttribute 注释,对于这些字段,我想重写 getter 实现并将调用重定向到 SecurityService.getSecureValue()实现。

原始类:

public class Properties {
@SecureAttribute
protected String password;

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

所需代理:

public class PropertiesProxy {
private SecurityService securityService;

public void setSecurityService(SecurityService var1) {
this.securityService = var1;
}

public SecurityService getSecurityService() {
return this.securityService;
}

@Override
public String getPassword() {
return securityService.getSecureValue(password);
}
}

发出一个字段很容易,但重写一个方法就变得复杂了。我找到了一些与我的任务相关的示例,我尝试应用这些示例,但似乎没有得到所需的结果。

所以我的主要问题是:如何跟踪和调试代码生成器?我学到的第一件事是将类打印到文件:

    DynamicType.Unloaded<?> unloadedType = byteBuddy.make();
unloadedType.saveIn(new File("d:/temp/bytebuddy"));

这给了我一个输出,其中添加了额外的字段,但看不到 getter 覆盖(从 .class 文件反汇编):

public class PropertiesImpl$ByteBuddy$OLlyZYNY extends PropertiesImpl {
private SecurityService securityService;

public void setSecurityService(SecurityService var1) {
this.securityService = var1;
}

public SecurityService getSecurityService() {
return this.securityService;
}

public PropertiesImpl$ByteBuddy$OLlyZYNY() {
}
}

这里我不太明白如何查找错误。这是否意味着我使用了完全错误的方法实现和 Byte Buddy简单地跳过它?还是我对 ElementMatchers 的理解有误?是否有一些痕迹或其他东西可以给我如何修复我的代码的线索?

当前实现:

private Class<?> wrapProperties() throws IOException {

DynamicType.Builder<?> byteBuddy = new ByteBuddy()
.subclass(PropertiesImpl.class)
.defineProperty("securityService", SecurityService.class);

Arrays.stream(PropertiesImpl.class.getDeclaredFields())
.filter(item -> item.getAnnotation(SecureAttribute.class) != null)
.forEach(item -> byteBuddy
.method(ElementMatchers.named(getGetterBeanName(item)))
.intercept(new GetterWrapperImplementation(item)));

DynamicType.Unloaded<?> unloadedType = byteBuddy.make();
unloadedType.saveIn(new File("d:/temp/bytebuddy"));
Class<?> wrapperClass = unloadedType.load(PropertiesImpl.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();

return wrapperClass;
}

public static class GetterWrapperImplementation implements Implementation {
public static final TypeDescription SS_TYPE;
public static final MethodDescription SS_GET_SECURE_VALUE;

private final Field filed;

static {
try {
SS_TYPE = new TypeDescription.ForLoadedType(SecurityService.class);
SS_GET_SECURE_VALUE = new MethodDescription.ForLoadedMethod(SecurityService.class.getDeclaredMethod("getSecureValue", String.class));
}
catch (final NoSuchMethodException | SecurityException e) {
throw new RuntimeException(e);
}
}


public GetterWrapperImplementation(Field filed) {
this.filed = filed;
}

@Override
public InstrumentedType prepare(final InstrumentedType instrumentedType) {
return instrumentedType;
}

@Override
public ByteCodeAppender appender(final Target implementationTarget) {
final TypeDescription thisType = implementationTarget.getInstrumentedType();

return new ByteCodeAppender.Simple(Arrays.asList(
TypeCreation.of(SS_TYPE),

// get securityService field
MethodVariableAccess.loadThis(),
FieldAccess.forField(thisType.getDeclaredFields()
.filter(ElementMatchers.named("securityService"))
.getOnly()
).read(),

// get secure field
MethodVariableAccess.loadThis(),
FieldAccess.forField(thisType.getDeclaredFields()
.filter(ElementMatchers.named(filed.getName()))
.getOnly()
).read(),

MethodInvocation.invoke(SS_GET_SECURE_VALUE),
MethodReturn.of(TypeDescription.STRING)
));
}
}

我所知道的事实是 ByteCodeAppender appender(final Target implementationTarget) 内的断点没有被击中,但再次不确定如何解释这一点。

谢谢。

最佳答案

Byte Buddy DSL 是不可变的。这意味着您始终必须调用:

builder = builder.method(...).intercept(...);

由于这个原因,你的 forEach 没有达到你的预期。

对于您的实现,您可以仅在一个字段上使用 MethodCall 并将另一个字段定义为参数。

关于java - Byte Buddy 的调试技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com