diff --git a/hw05-aop/build.gradle b/hw05-aop/build.gradle new file mode 100644 index 0000000..7ab9f68 --- /dev/null +++ b/hw05-aop/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'java' +} + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +dependencies { +} diff --git a/hw05-aop/src/main/java/ru/otus/Main.java b/hw05-aop/src/main/java/ru/otus/Main.java new file mode 100644 index 0000000..487b7a3 --- /dev/null +++ b/hw05-aop/src/main/java/ru/otus/Main.java @@ -0,0 +1,14 @@ +package ru.otus; + +import ru.otus.app.CalculateImpl; +import ru.otus.app.Ioc; + +public class Main { + public static void main(String[] args) { + var calculate = Ioc.createCalculateLogImpl(new CalculateImpl()); + calculate.calculation(1323); + + + + } +} \ No newline at end of file diff --git a/hw05-aop/src/main/java/ru/otus/app/Calculate.java b/hw05-aop/src/main/java/ru/otus/app/Calculate.java new file mode 100644 index 0000000..ab120c1 --- /dev/null +++ b/hw05-aop/src/main/java/ru/otus/app/Calculate.java @@ -0,0 +1,6 @@ +package ru.otus.app; + + +public interface Calculate { + void calculation(int number); +} \ No newline at end of file diff --git a/hw05-aop/src/main/java/ru/otus/app/CalculateImpl.java b/hw05-aop/src/main/java/ru/otus/app/CalculateImpl.java new file mode 100644 index 0000000..cf03429 --- /dev/null +++ b/hw05-aop/src/main/java/ru/otus/app/CalculateImpl.java @@ -0,0 +1,9 @@ +package ru.otus.app; + +public class CalculateImpl implements Calculate { + @Log + @Override + public void calculation(int number) { + System.out.println(number + number); + } +} \ No newline at end of file diff --git a/hw05-aop/src/main/java/ru/otus/app/Ioc.java b/hw05-aop/src/main/java/ru/otus/app/Ioc.java new file mode 100644 index 0000000..1f87a8a --- /dev/null +++ b/hw05-aop/src/main/java/ru/otus/app/Ioc.java @@ -0,0 +1,52 @@ +package ru.otus.app; + +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Ioc { + private Ioc() {} + + public static Calculate createCalculateLogImpl(Calculate calculate){ + InvocationHandler invocationHandler = new MyHandler(calculate); + return (Calculate) Proxy.newProxyInstance(Ioc.class.getClassLoader(), new Class[]{Calculate.class}, invocationHandler); + + } + private static class MyHandler implements InvocationHandler { + private final Calculate calculate; + private final List methodsWithAnnotation; + + MyHandler(Calculate calculate) { + this.calculate = calculate; + List methodsWithAnnotationCalculate = new ArrayList<>(); + + for (Method method : calculate.getClass().getDeclaredMethods()) { + for (Annotation annotation : method.getDeclaredAnnotations()) { + if (annotation.annotationType() == Log.class) { + methodsWithAnnotationCalculate.add(method); + } + } + } + this.methodsWithAnnotation = methodsWithAnnotationCalculate; + } + + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + //проверяем по названию и по массиву аннотаций + for (Method annotatedMethod: methodsWithAnnotation) { + if (annotatedMethod.getName().equals(method.getName()) && + Arrays.toString(annotatedMethod.getParameterTypes()).equals(Arrays.toString(method.getParameterTypes()))) { + System.out.println("выполняем метод " + method.getName() + ", параметры " + Arrays.toString(args)); + break; + } + } + return method.invoke(calculate, args); + } + + } +} \ No newline at end of file diff --git a/hw05-aop/src/main/java/ru/otus/app/Log.java b/hw05-aop/src/main/java/ru/otus/app/Log.java new file mode 100644 index 0000000..b3d12fc --- /dev/null +++ b/hw05-aop/src/main/java/ru/otus/app/Log.java @@ -0,0 +1,12 @@ + +package ru.otus.app; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Log { +} \ No newline at end of file