1. Отражение на Java
1. Загрузите атрибуты класса и код экземпляра метода через отражение:
/*** java.lang.class является источником отражения* Мы создали класс и сгенерировали соответствующий файл класса с помощью компиляции (javac.exe). После того, как мы загрузим (загрузчик класса JVM) этот файл класса* После того, как этот файл класса загружен в память, это класс времени выполнения с областью кеша. Этот класс времени выполнения является экземпляром класса * Каждый класс времени выполнения загружается только один раз, */ class <tooldexam> clazz = studentExam.class; StudentExam StudentExam = clazz.newinstance (); System.err.println (StudentExam); System.out.println (clazz); // Field Field = clazz.getfield ("id"); // Вызовите указанный атрибут класса времени выполнения через атрибут: атрибут - это поле общественного типа = clazz.getDeclaredfield ("id"); // Атрибут-непубличное поле типа [] fields = clazz.getDeclaredFields (); // Получить все объявленные свойства самого класса выполнения (родительский класс не может сделать). Родительский класс использует clazz.getfields (); для (поле Field2: Fields) {int i = Field2.getModifiers (); String type = modifier.toString (i); // Получить тип данных системы атрибута поля. } field.SetAccessible (true); Field.Set (StudentExam, 11); System.err.println (StudentExam.getId ()); // вызовуте указанный метод класса времени выполнения через метод отражения = clazz.getMethod ("setId", integer.class); Method.invoke (StudentExam, 123); // вызовуте указанный метод метода класса выполнения [] methods = clazz.getMethods (); // Получить все методы, объявляемые общедоступными во всех классах времени выполнения, и их метод родительских классов [] methods2 = clazz.getDeclaredMethods (); // Получить метод, объявленный в самом классе времени выполнения для (метод метода 2: методы) {System.out.println (method2.getName ()); } // * Получить класс времени выполнения объекта через метод getClass () объекта, экзамен = new Exam (); Класс clazzexam = exam.getClass ();2. ClassLoader
/**! // Путь записывается в пакете: com // able // onlineexam // resources // config.properties inputstream instream = loader.getresourceasstream ("config.properties"); // Метод 2. Загрузите файл из указанного пути // fileInputStream fileInputStream = new FileInputStream (new File ("config.properties")); Свойства свойства = новые свойства (); Свойства. загрузка (instrem); // properties.load (fileInputStream); String prop = properties.getProperty ("домен"); System.out.println (prop); }3. Динамический прокси
Статический прокси: типы класса прокси и целевой объект определяются во время компиляции, что не способствует расширению программы. В то же время каждый класс прокси может обслуживать только один интерфейс, поэтому слишком много прокси неизбежно произойдет в разработке программы.
Динамический прокси: клиент вызывает методы других объектов через класс прокси и динамически создает прокси -объект целевого класса по мере необходимости при запуске программы.
Принципы модели дизайна агента:
Используйте прокси, чтобы обернуть объект, а затем замените исходный объект этим прокси -объектом. Любой вызов исходного объекта должен быть через прокси, независимо от того, определяет ли прокси -объект объект.
пакет com.test.junit; Импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; Public Class Proxytest {public static void main (string [] args) {RealSubject RealSubject = new RealSubject (); MyInvocationHandler myInvocationHandler = new MyInvocationHandler (); Object Object = myInvocationHandler.bind (RealSubject); Субъект субъекта = (субъект) объект; субъект.action (); }} // Использование субъекта динамического прокси -интерфейса {void action ();} // class RealSubject реализует субъект {@Override public void action () {System.out.println («Я - класс прокси, не забудьте выполнить меня ...»); }} класс myInvocationHandler реализует vocationHandler {объект объекта; // Объявление объекта прокси -класса интерфейса/ ** * = объект; return proxy.newproxyinstance (object.getClass (). getClassLoader (), object.getClass (). getInterfaces (), это); } / ** * Когда вызов к переписываемому методу инициируется через объект класса прокси, он будет преобразован в призыв к следующему методу Invok * / @@override public Object invoke (Object Proxy, Method Method, Object [] args) бросает Throwable {Object returnObject = method.invoke (Object, args); return returnObject; }}4. Динамический прокси и AOP
Пример 1.
пакет com.atguigu.spring.aop; публичный интерфейс arithmeticcalculator {int add (int i, int j); int sub (int i, int j); int mul (int i, int j); int div (int i, int j);} пакет com.atguigu.spring.aop; Import org.springframework.stereotype.component; @Component ("arithmeticcalculator") открытый класс arithmeticcalculatorimpl реализует arithmeticcalculator {@override public int add (int i, int j) {int result = i + j; результат возврата; } @Override public int sub (int i, int j) {int result = i - j; результат возврата; } @Override public int mul (int i, int j) {int result = i * j; результат возврата; } @Override public int div (int i, int j) {int result = i / j; результат возврата; }} пакет com.atguigu.spring.aop; открытый класс arithmeticCalculatorLoggingImpl реализует арифметикукалкулятор {@Override public int add (int i, int j) {System.out.println («Метод добавляет начинается с [» + i + »,« + j + "]"); int result = i + j; System.out.println («Метод добавляет концы с« + результатом); результат возврата; } @Override public int sub (int i, int j) {System.out.println («Подвод метода начинается с [» + i + "," + j + "]"); int result = i - j; System.out.println («Метод заканчивается с« + результатом); результат возврата; } @Override public int mul (int i, int j) {System.out.println («Метод mul начинается с [" + i + "," + j + "]"); int result = i * j; System.out.println («Метод mul начинается с [» + i + "," + j + "]"); int result = i * j; System.out.println («Метод mul заканчивается« + результатом); результат возврата; } @Override public int div (int i, int j) {System.out.println («Метод div начинается с [» + i + "," + j + "]"); int result = i / j; System.out.println («Метод div заканчивается» + результатом); результат возврата; }} пакет com.atguigu.spring.aop; Импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.util.arrays; открытый класс arithmeticcalculatorloggingproxy {// объект для того, чтобы быть прокси -целевой арифметизированной кальцитацией; Публичный арифметический калькулятор, арифметический коэффициент, цель) {super (); this.Target = target; } // возвращать объект Proxy public arithmeticcalculator getLoggingProxy () {arithmeticCalculator proxy = null; // Какой класс загрузчик объекта Proxy отвечает за загрузку загрузки ClassLoader = target.getClass (). GetClassLoader (); // тип прокси -объекта, то есть какие методы в нем. Class [] interfaces = new Class [] {arithmeticCalculator.class}; // При вызове методов прокси -объекта выполните следующий код vocationHandler H = new InvocationHandler () { /*** Proxy: Proxy Object. Этот объект, как правило, не используется* Метод: метод, называемый* ARGS: параметры, передаваемые в методе вызова*/ @@override public oblect invoke (объект прокси, метод метода, объект [] args), бросает Throwable {// Метод прокси -объекта не будет вызван непосредственно внутри метода. proxy.tostring () приведет к тому, что мертвый цикл вызовет метод invoke methodname = method.getName (); // Распечатать систему журнала. // вызов объекта целевого метода result = null; try {// result result = method.invoke (target, args); // Возвращение уведомления, вы можете получить доступ к возвратному значению метода} Catch (nullPointerException e) {e.printstackTrace (); // Уведомление об исключении, вы можете получить доступ к исключению метода} // Пост-нотификация. Поскольку метод может иметь исключение, возвращаемое значение метода не может быть доступно // print log System.out.println ("[после] метод заканчивается" + result); результат возврата; }}; /*** Загрузчик: загрузчик класса, используемый прокси -объектом. * Интерфейсы: укажите тип объекта прокси. То есть какие методы можно найти в прокси -прокси -объекте. * H: При вызове метода прокси -объекта, как он должен ответить? Фактически, это должно вызвать метод invoke of upocationhandler*/ proxy = (arithmeticcalculator) proxy.newproxyinstance (погрузчик, интерфейсы, h); вернуть прокси; }} пакет com.atguigu.spring.aop; Import org.springframework.context.applicationContext; Import org.springframework.context.support.classpathxmlapplicationContext; открытый класс main {public static void main (string [] args) {// arithmeticcalculator arithmeticcalculator = new arithmeticcalculatorimpl (); Арифметикация арифметического кальцилятора = новый арифметичный калькулятор, arithmeticcalculator = new arithmeticcalculatorloggingproxy (arithmeticcalculator) .getLoggingProxy (); int result = arithmeticcalculator.add (11, 12); System.out.println ("Результат:" + Результат); result = arithmeticcalculator.div (21, 3); System.out.println ("Результат:" + Результат); }}Пример 2.
пакет com.test.junit; Импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; Public Class Proxytest {public static void main (string [] args) {RealSubject RealSubject = new RealSubject (); MyInvocationHandler myInvocationHandler = new MyInvocationHandler (); Object Object = myInvocationHandler.bind (RealSubject); Субъект субъекта = (субъект) объект; субъект.action (); }} // Использование субъекта динамического прокси -интерфейса {void action ();} // class RealSubject реализует субъект {@Override public void action () {System.out.println («Я - класс прокси, не забудьте выполнить меня ...»); }} класс myInvocationHandler реализует vocationHandler {объект объекта; // Объявление объекта прокси -класса интерфейса/ ** * = объект; return proxy.newproxyinstance (object.getClass (). getClassLoader (), object.getClass (). getInterfaces (), это); } / ** * Когда вызов к переписываемому методу инициируется через объект класса прокси, он будет преобразован в призыв к следующему методу Invok * / @@override public Object invoke (Object Proxy, Method Method, Object [] args) бросает Throwable {Object returnObject = method.invoke (Object, args); return returnObject; }}Спасибо, что прочитали эту статью, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!