Аннотация для выводов логов методов при помощи прокси

118
02 сентября 2019, 21:10

Как создать аннотацию, которая выводила бы логи для любого метода, при помощи прокси.

public class Test {
@LogMethodData
public int sum(int first, int second) {
    return first + second;
}}

а на выводе было что то вроде:

янв 26, 2019 5:01:42 PM com.qwerty.classboot.Test sum
Answer 1

Пример создания прокси через cglib.

Аннотация:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogMethodData {
}

Класс для проверки:

public class MyClass {
    @LogMethodData
    public String method1() {
        return "this is method1";
    }
    public String method2() {
        return "this is method2";
    }
}

Пример программы:

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import org.apache.log4j.Logger;
import java.lang.annotation.Annotation;
public class App {
    public static void main( String[] args ) {
        MyClass myClass = (MyClass) proxyWrapper(new MyClass());
        System.out.println(myClass.method1());
        System.out.println(myClass.method2());
    }
    private static Object proxyWrapper(Object instance) {
        MethodInterceptor handler = (obj, method , args, proxy) -> {
            Annotation annotation = method.getAnnotation(LogMethodData.class);
            if(annotation != null){
                Logger logger = Logger.getLogger(instance.getClass());
                logger.info(method.getName());
            }
            return proxy.invoke(instance, args);
        };
        return Enhancer.create(instance.getClass(), handler);
    }
}
READ ALSO
Найти все доступные для подключения пк

Найти все доступные для подключения пк

Пишу приложение для пк и телефона на сокетахСейчас при открытии соединения на пк показывается его ip/порт, а на телефоне я сам указываю ip и порт...

121
Переменная типа boolean в условии останавливает выполнение программы. Почему?

Переменная типа boolean в условии останавливает выполнение программы. Почему?

Мне нужно в качестве задания написать простенькую программу по условиям игры "Жизнь"Все значения поля у меня хранятся в массиве булевых значений

101
Как строку преобразовать в имя пэкеджа

Как строку преобразовать в имя пэкеджа

buffer - это StringBuilder полученный из ввода пользователя(buffer

112
Взаимное заполнение EditText-ов

Взаимное заполнение EditText-ов

Задача чтоб, при изменении первого editText'а изменялся 2-ой, а при изменении 2-го - первый

135