Bytebuddy - подкласс финального класса

Я пытаюсь написать общий метод, который выглядит так:

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 Я бы хотел, чтобы мой метод мог создавать подклассы также для финальных классов. Есть ли обходной путь для этой проблемы?


person k13i    schedule 24.08.2018    source источник


Ответы (1)


Не существует способа создать подкласс конечного класса. Это запрещено спецификацией языка. .

ByteBuddy в значительной степени соблюдает спецификацию языка, поэтому даже если вы хотите расширить окончательный класс, вы не сможете это сделать, если не сможете манипулировать байт-кодом класса, который хотите переопределить, чтобы он был не final, хотя в этот момент вы возитесь с вещами, которыми на самом деле быть не должны.

person Makoto    schedule 24.08.2018
comment
Это именно то, что я хочу сделать, то есть манипулировать байтовым кодом, чтобы сделать его не окончательным. - person k13i; 25.08.2018
comment
В этом случае вам придется переопределить исходный класс, который вы создаете подклассом. Вы должны сделать это до того, как класс будет загружен, посмотрите в агентах Java, как это сделать. - person Rafael Winterhalter; 26.08.2018
comment
Вы можете сказать: «ByteBuddy в значительной степени соблюдает спецификацию языка», вы также можете сказать, что ByteBuddy просто рано отлавливает ошибку, которая в любом случае появится позже, поскольку JVM отклонит подкласс конечного класса, если вы проигнорируете окончательный характер конечного класса. суперкласс при генерации кода… - person Holger; 27.08.2018