2015-02-15 5 views
2

Можно использовать aspectj или javassist для расширения класса с общим классом? например, у меня есть класс с:Расширение класса java с дженериками динамически

@someAnnotation(GenerictTypeParameter.class) 
public aClass{ 
    ... 
} 

так что идея искать все классы с @someAnnotation, а затем распространить их с другим классом и получить это:

public aClass extends anotherClass<GenericTypeParameter>{ 
    ... 
} 
+1

Учитывая, что в любом случае вам нужно добавить аннотацию и параметр в класс, что бы это дало вам прямое распространение в обычном режиме? –

+0

Мне интересно это, и я хочу знать, возможно ли, может быть, полезно понять, что вы можете сделать с этими технологиями, возможно, будет полезно решить, какой класс будет расширяться в зависимости от того, какие аннотации вы добавляете, и необходимость добавления дженериков. Например, если присутствует '@ someAnnotation', распространяется на класс, но если присутствует и' @ someAnotheAnnotation', то распространяется на другой класс, возможно, также на развязку расширенного класса. –

+0

@DiegoFernandoMurilloValenci, пожалуйста, имейте в виду, что дженериков не существует на уровне байт-кода, только в источнике. Поэтому использование ** javaassist ** не имеет смысла, и по этой причине оно не поддерживает дженерики. ** aspectj ** мог бы что-то сделать здесь, предоставляя вам использовать метод «с исходным кодом», а не стратегии байт-кода или загрузчика. – diginoise

ответ

0

Вы можете сделать это с помощью Byte Buddy , если вы хотите использовать другую библиотеку генерации кода. С Byte Buddy вы можете:

new ByteBuddy() 
    .subclass(TypeDescription.Generic.Builder 
       .parameterizedType(AnotherClass.class, GenericTypeParameter.class) 
       .build()) 
    .make(); 

Вы можете просто устранить соответствующий тип из аннотации. Byte Buddy также позволяет вам переопределять существующие типы, если это то, чего вы пытаетесь достичь.