【问题标题】:Bytebuddy - subclass a final classBytebuddy - 子类最终类
【发布时间】:2019-01-31 09:30:05
【问题描述】:

我正在尝试编写一个如下所示的通用方法:

private static <T> Class<? extends T> immutableVersionOfClass(Class<T> clazz) {
    return new ByteBuddy()
            .subclass(clazz)
            .method(not(returns(VOID)))
            .intercept(to(GetterInterceptor.class))
            .method(returns(VOID))
            .intercept(to(SetterInterceptor.class))
            .make()
            .load(clazz.getClassLoader())
            .getLoaded();
}

但是当最终类作为参数传递时,我得到一个异常: java.lang.IllegalArgumentException: Cannot subclass primitive, array or final types 我希望我的方法能够继承最终类。这个问题有什么解决方法吗?

【问题讨论】:

    标签: java byte-buddy bytecode-manipulation final-class


    【解决方案1】:

    没有办法子类化最终类。被language spec禁止。

    ByteBuddy 很大程度上尊重语言规范,因此即使您想扩展最终类,除非您能够将要覆盖的类的字节码操作为 not final,虽然那时你正在搞一些你真正不应该做的事情。

    【讨论】:

    • 这正是我想要做的,即操纵字节码以使其成为非最终的。
    • 在这种情况下,您必须重新定义要子类化的原始类。您必须在加载类之前执行此操作,请查看 Java 代理以了解如何执行此操作。
    • 你可以说“ByteBuddy 很大程度上尊重语言规范”,你也可以说,ByteBuddy 只是早早地发现了一个错误,无论如何以后都会出现,因为 JVM 将拒绝最终类的子类,如果你在生成代码时忽略了超类的最终性质……
    猜你喜欢
    • 2019-05-15
    • 2017-01-03
    • 1970-01-01
    • 2018-03-24
    • 2016-07-16
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多