From 11b13e992412f8d637e7ed2345533a42b42a4a95 Mon Sep 17 00:00:00 2001 From: samat Date: Fri, 24 Mar 2023 15:50:11 +0400 Subject: [PATCH] =?UTF-8?q?hw05-aop=20-=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=B0=D1=81=D0=BF=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BD=D0=BE-=D0=BE=D1=80=D0=B8=D0=B5=D0=BD=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B5=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hw05-aop/build.gradle | 9 ++++ hw05-aop/src/main/java/ru/otus/Main.java | 14 +++++ .../src/main/java/ru/otus/app/Calculate.java | 6 +++ .../main/java/ru/otus/app/CalculateImpl.java | 9 ++++ hw05-aop/src/main/java/ru/otus/app/Ioc.java | 52 +++++++++++++++++++ hw05-aop/src/main/java/ru/otus/app/Log.java | 12 +++++ 6 files changed, 102 insertions(+) create mode 100644 hw05-aop/build.gradle create mode 100644 hw05-aop/src/main/java/ru/otus/Main.java create mode 100644 hw05-aop/src/main/java/ru/otus/app/Calculate.java create mode 100644 hw05-aop/src/main/java/ru/otus/app/CalculateImpl.java create mode 100644 hw05-aop/src/main/java/ru/otus/app/Ioc.java create mode 100644 hw05-aop/src/main/java/ru/otus/app/Log.java 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