在Java中如何使用Byte Buddy分配字段?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中如何使用Byte Buddy分配字段?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2341字,纯文字阅读大概需要4分钟。
内容图文
我很难理解Byte Buddy的文档.为了帮助我学习API,我想生成相当于这个Java的字节码:
public final class GeneratedByByteBuddy {
private final int a;
public GeneratedByByteBuddy(final int a) {
this.a = a;
}
}
我很难找到使用Instrumentation创建字段分配的正确方法.
解决方法:
您正在创建一个具有自定义字节代码的类.为此,您不能使用内置Instrumentation,但需要编写自己的检测,为构造函数创建特定的字节代码.这个Instrumentation当然可以为Byte Buddy实现,但是如果你知道关于你生成的类的所有细节,那么使用javac编译这个类会更好.我假设你想要了解API,这不是你想要创建的实际类.
对于您的示例类,您需要实现构造函数的desugared版本的等效项.构造函数只是Java运行时的方法,但它们遵循由JVM的验证程序强制执行的特定语义. desugared构造函数看起来像:
public GeneratedByByteBuddy(int a) {
super();
this.a = a;
return;
}
这个同一个类的Byte Buddy实现如下所示:
new ByteBuddy()
.subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
.name("my.company.GeneratedByByteBuddy")
.defineField("a", int.class, Visibility.PRIVATE, FieldManifestation.FINAL)
.defineConstructor(Arrays.<Class<?>>asList(int.class), Visibility.PUBLIC)
.intercept(new Instrumentation() {
@Override
public InstrumentedType prepare(InstrumentedType instrumentedType) {
return instrumentedType;
}
@Override
public ByteCodeAppender appender(final Target instrumentationTarget) {
return new ByteCodeAppender() {
@Override
public boolean appendsCode() {
return true;
}
@Override
public Size apply(MethodVisitor methodVisitor,
Context instrumentationContext,
MethodDescription instrumentedMethod) {
StackManipulation.Size size = new StackManipulation.Compound(
MethodVariableAccess.REFERENCE.loadFromIndex(0),
MethodInvocation.invoke(new TypeDescription.ForLoadedType(Object.class)
.getDeclaredMethods()
.filter(isConstructor().and(takesArguments(0))).getOnly()),
MethodVariableAccess.REFERENCE.loadFromIndex(0),
MethodVariableAccess.INTEGER.loadFromIndex(1),
FieldAccess.forField(instrumentationTarget.getTypeDescription()
.getDeclaredFields()
.named("a"))
.putter(),
MethodReturn.VOID
).apply(methodVisitor, instrumentationContext);
return new Size(size.getMaximalSize(), instrumentedMethod.getStackSize());
}
};
}
})
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION);
每个方法实现都由Instrumentation实现,Instrumentation能够通过添加字段或方法来修改创建的类型.这对你的班级来说不是必需的.然后,它发出一个ByteCodeAppender,用于查询字节码指令.
内容总结
以上是互联网集市为您收集整理的在Java中如何使用Byte Buddy分配字段?全部内容,希望文章能够帮你解决在Java中如何使用Byte Buddy分配字段?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。