java - Byte Buddy 为构造函数实例化不带参数的类

标签 java proxy jvm byte-buddy

我正在尝试实例化一个没有空参数构造函数的类(而且它的直接父类也没有空参数构造函数)

Class<?> newClass = new ByteBuddy();
            .subclass(BufferedImage.class)
            ...
            .make()
            .load(BufferedImage.class.getClassLoader())
            .getLoaded();
BufferedImage bufferedImage = dynamicTypeBufferedImage.getConstructor().newInstance();

我想知道这是否可以使用 byte buddy。目前我收到一条错误消息,指出未找到代理类的 getConstructor() 这很有意义,因为空参数构造函数不存在。有没有一种方法可以定义空参数构造函数以使该实例化起作用?

我试过:

...
.constructor(any()).intercept(to(new Object() {
    public void construct() throws Exception {
        System.out.println("CALLING XTOR");
    }
 }).andThen(SuperMethodCall.INSTANCE)) // This makes the difference!
...

来自here并给了我图像类没有 super()(这是 BufferedImage 的父类)的错误。

我也试过:

...
.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall
           .invoke(superClass.getDeclaredConstructor())
           .onSuper())
...

来自here

最后,我还尝试了 .subclass(type, ConstructorStrategy.Default.IMITATE_SUPER_CLASS); 模仿父类(super class)的方法,但这似乎没有添加空参数构造函数。

我想要的这个功能模仿了 cglib 使用增强器实例化其对象的方式。从我一直在阅读的内容中我知道字节伙伴应该让用户决定如何实例化。我想知道是否有一种简单的方法可以将默认实例化设置为空参数构造函数,因为我不关心在类中设置字段,而只想控制方法空间?

最佳答案

定义不以某种方式(直接或通过另一个构造函数)调用其 super 构造函数的 Java 构造函数是不合法的,因为它不能用字节代码表示,也不能在 Byte Buddy 中完成。

你可以做的是:

  1. 不要使用 ConstructorStrategy.Default.NO_CONSTRUCTORS 一起定义构造函数。
  2. 使用类似Objenesis 的库实例化一个类。

但请注意,Objenesis 使用的是不安全的 API, future 的 Java 版本可能不支持该 API。

关于java - Byte Buddy 为构造函数实例化不带参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478383/

相关文章:

c# - WinSCP .NET 程序集 : Where to define proxy?

text - 如何使Emacs文本像Netbeans一样清晰呈现

java - 在我的 java 应用程序中使用 org.eclipse.core.resources 方法

python - 使用带代理的 selenium 时无法访问该网站

java - Dice Doubles Java 练习 - 逻辑错误

json - 你如何使用 proxy.conf.json 将数据返回到你的 Angular 应用程序?

java - Java java.util.concurrent.locks.Lock 如何保证线程之间的内存同步?

java - 以编程方式(或替代方案)设置 Djava.library.path?

java - 使用 PrivilegedMode=TRUE 的 AWS 精选 Docker 镜像创建 CodeBuild 项目

java - 系统找不到指定的路径(java eclipse)