- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
在使用指南阅读和理解 linux 内核时- http://www.johnchukwuma.com/training/UnderstandingTheLinuxKernel3rdEdition.pdf
我们正在尝试这种叫做:buddy.works的服务,以取代我们的jenkins管道,用于较小的项目。它提供了用于创建管道的gui,但是我们在访问子目录时遇到了问题。 Resolving host 52
我正在尝试为 springboot 应用程序构建自定义代理。这就是我的代理 premain 的样子 .with(new AgentBuilder.Initializat
我正在尝试使用 Byte Buddy 生成一个非常简单的代码. 我有一个 POJO 类,其中一些字段用 @SecureAttribute 注释,对于这些字段,我想重写 getter 实现并将调用重定向
我已经阅读并理解了二进制伙伴内存分配方法背后的概念,并且我正在尝试将其应用到 C 语言中,但在真正开始之前,我有一些特定于实现的问题。 https://drive.google.com/file/d/
我正在尝试围绕某些类图中的类生成运行时包装器,但我不知道当图中存在循环时如何处理这种情况。想象一下,有一个类 A 有一个类型 B 的字段,但类型 B 有一个类型 A 的字段。我想生成类 A' 和 B'
我看到术语“Buddy 类”被用作“如何向另一个文件中的部分类添加注释”等问题的“答案”,但这些答案假设我知道 Buddy 类 是什么,并且代码示例假设我理解这是如何工作的/为什么工作。 对于 C#
假设我有一个方法m: public void m() { String foo = "foo"; int bar = 0; doSomething(foo, bar); } 我想使用 By
我正在尝试解决人才伙伴的这个问题。 http://www.talentbuddy.co/challenge/52a9121cc8a6c2dc91481f8d5233cc274af0110af382f4
我正在尝试生成具有循环类依赖性的类,类似于这个问题:Byte Buddy - Handling cyclic references in generated classes 作为一个最小的例子,我想生
有必要描述一下这个类的结构 class A{ private List listA; } 尝试了解决方案:Byte-buddy: generate classes with cyclic
我正在尝试实例化一个没有空参数构造函数的类(而且它的直接父类也没有空参数构造函数) Class newClass = new ByteBuddy(); .subclass(Bu
即使我提供了实际的实例,Byte Buddy 似乎也只喜欢将公共(public)类作为拦截器实现;我经常发现自己想做这样的事情: import static MethodDelegation.to;
我正在尝试使用反射来检查给定类的属性是否设置了 ReadOnly 属性。我使用的类是 MVC View 模型(使用部分“伙伴”类作为元数据。 public partial class Account
我正在尝试使用 Java 代理向类添加方法。但它给出了如下错误。 java.lang.VerifyError: Local variable table overflow Exception Deta
是否可以使用 bytebuddy 创建一个全新的类和方法? 我看到的所有示例都使用现有类或拦截现有方法来修改它们。 是否有通过bytebuddy构造一个类并动态添加一些方法并返回该类的实例的示例? 最
几天来我一直在寻找“如何在运行时向方法添加注释”的答案,并找到了这个名为 Byte Buddy 的很棒的工具,使用了它,但仍然无法按我的需要使其工作到。我确定它必须能够从这个问题中做到这一点 Can
我正在尝试使用 ByteBuddy 实现 Profiler。我目前正在努力有效地为我正在分析的方法创建适当的签名。 这是我当前实现的要点:https://gist.github.com/felixba
我正在尝试使用 Byte Buddy 设置一个类,该类实现给定实例的所有接口(interface)并将所有调用转发给该实例,这是我目前的代码: import static net.bytebuddy.
我是 Byte Buddy 的新手,我正在尝试使用它来创建对对象执行 getter 方法的接口(interface)的实现。我的界面如下所示: public interface Executor {
我是一名优秀的程序员,十分优秀!