Классы фильтров, которые снабжены указанной аннотацией - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Java-агенты для манипулирования байт-кодом, и я хотел бы сгенерировать методы в классы, которые снабжены конкретной аннотацией.Как я могу это сделать?

Примерно так:

@Foo public class Bar {
    // inject methods here
}

Если это возможно, отфильтруйте по полному квалифицированному имени аннотации, например, com.example.Foo вместо Foo.class.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете использовать ElementMatchers для реализации hasAnnotation(annotationType(named(...))).

0 голосов
/ 15 февраля 2019

Я нашел подходящее решение, используя метод ElementMatchers.isAnnotatedWith и передавая класс аннотации в качестве параметра, но я все еще ищу способ фильтрации по полному квалифицированному имени аннотации как чистое String.

new AgentBuilder.Default()
            .type(isAnnotatedWith(ToString.class))
            .transform(new AgentBuilder.Transformer() {
                @Override public DynamicType.Builder<?> transform(
                        DynamicType.Builder<?> builder,
                        TypeDescription typeDescription,
                        ClassLoader classLoader,
                        JavaModule javaModule
                ) {
                    // do some logic here
                }
            }).installOn(instrumentation);
...