是否可以使用bytebuddy在其中创建一个全新的类和方法?
我看到的所有示例都使用现有的类或对现有方法进行拦截以对其进行修改。
是否有任何示例可以构造一个类并通过bytebuddy动态添加一些方法并返回该类的实例?
所有Java类都需要扩展另一个类,因此您至少需要扩展Object.class
。使用接口或替换现有类中的方法,使它们在不大量使用反射的情况下就可用,这就是许多人要做的。但这不是必需的。
Subclass Object.class
添加您的方法/字段并委托给您用Java编写的实际方法。 “ Hello World”示例正是这样做的。
Class<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.method(ElementMatchers.named("toString"))
.intercept(FixedValue.value("Hello World!"))
.make()
.load(getClass().getClassLoader())
.getLoaded();
assertThat(dynamicType.newInstance().toString(), is("Hello World!"));
Byte Buddy可以创建动态方法主体,但是在那种情况下,您基本上是编写Java汇编程序。如果您需要帮助,则可能要问一个关于要创建的内容的更具体的问题。
如果您可以将您的需求放入字节预算的注释/会议/拦截/委托方法中,我强烈建议您尝试使用它。您的代码将是可调试的(您可以在委托中设置断点),并且由知道如何编写正确的Java汇编器(胶水的Javac和字节伙伴)的人员生成。