Механизм отражения Java и динамический прокси делают Java более мощным. Основные концепции Spring IOC и AOP реализованы с помощью механизма отражения и динамического прокси.
1 Java Reflection
Пример:
User user = new user (); user.settime5flag ("test"); Class <?> Cls = class.forname ("com.test.user"); // Интерфейс должен быть общедоступным, независимо от того, используется ли он внутренне в этом классе! Либо используйте cls.getdeclaredmethod (), либо пройдите, чтобы изменить метод доступности метода = cls.getmethod ("gettime5flag"); String res1 = (string) method.invoke (user); System.out.println (res1); // Если вы включаете основные типы, такие как int, используйте int.class! Integer.class! = Int.class! method = cls.getmethod ("settime5flag", string.class); method.invoke (пользователь, "Rollen"); method = cls.getmethod ("gettime5flag"); String res2 = (string) method.invoke (user); system.out.println (res2);Получите полное имя пакета и класса через объект:
user.getClass (). getName (); // Имя класса полного пути user.getClass (). getSiMplename (); // Имя класса без имени пакета
Получить класс:
Class.forname ("com.test.user"); com.test.user.class; user.getClass (); Создавать объект через классПользователь пользователя = (пользователь) cls.newinstance (); // Должен быть конструктор параметровПолучите все конструкторы
Конструктор <?> Ons [] = cls.getConstructors (); // возвращать минусы [0] .newinStance () в порядке объявления; // нет объявления отображения, тогда есть конструктор по умолчаниюПолучить все интерфейсы, реализованные классом
Класс <?> Intes [] = cls.getInterfaces ();Получить родительский класс
cls.getsuperclass ();Получите модификатор
int mo = cls.getmodifiers (); int mo = ins [0] .getModifiers (); int mo = method.getModifiers (); modifier.toString (mo);Получить параметры метода
method.getParameters (); минусы [0] .getParameters ();Получить тип параметра метода
method.getParametortypes (); ans [0] .getParametorTypes ();Получите все типы исключений, брошенные декларацией метода
method.getExceptionTypes ();Получить все свойства, объявленные в этом классе
Field [] field = cls.getDeclaredFields (); // Включите Privatefield [0] .getModifiers (); поле [0] .getType ();
Получить все публичные атрибуты этого класса, включая объявление родительского класса, декларацию интерфейса и все публичные атрибуты этого класса.
cls.getfields ();
Установите указанный атрибут на доступ
field.setAccessible (true); field.set (obj, 'ces'); field.get (obj);
* Разница между getFields () и getDeclaredFields (): getFields () может получить доступ только к полям, объявленным как публичные в классе. Он не может получить доступ к частным полям и может получить доступ к общественным полям, унаследованным от других классов. GetDeclaredFields () может получить доступ ко всем полям в классе, что не имеет ничего общего с государственным, частным и защищающим, но не может получить доступ к полям, унаследованным от других классов.
* Разница между getmethods () и getDeclaredMethods (): getMethods () может получить доступ только к методам, объявляемым как общедоступные в классе, а частные методы не могут быть доступны, и могут получить доступ к публичным методам, унаследованным от других классов; GetDeclaredMethods () может получить доступ ко всем полям в классе, что не имеет ничего общего с публичным, частным и защищенным и не может получить доступ к методам, унаследованным от других классов.
* Разница между getConstructors () и getDeclaredConstructors (): getConstructors () может получить доступ только к конструкторам, объявляемым как публичные в классе; GetDeclaredConstructors () может получить доступ к всем конструкторам в классе и не имеет ничего общего с государственным, частным и защищенным.
Получить и изменить информацию массива посредством размышлений
int [] temp = {1,2,3,4,5}; class <?> demo = temp.getClass (). getComponentType (); System.out.println («Тип массива:»+demo.getName ()); // intsystem.out.println ("Array:"+ray.gretlength (emp); Первый элемент массива: "+array.get (temp, 0)); // 1Array.set (temp, 0, 100); system.out.println (" Первый элемент массива после модификации: "+array.get (temp, 0)); // 100 Получите тип массиваcls.getComponentType ();Определите, является ли это типом массива
cls.isarray ();
2 Java Agent
Прокси -модель является обычно используемой моделью дизайна Java. Его характеристика заключается в том, что класс прокси и класс делегатов имеет одинаковый интерфейс. Класс прокси несет главным образом ответственность за предварительные сообщения, фильтрацию сообщений, пересылку сообщений в класс делегатов и обработку сообщений после события. Обычно существует связь между прокси -классом и классом делегатов. Объект прокси -класса связан с объектом класса делегатов. Сам объект класса прокси по -настоящему не реализует Сервис, но предоставляет конкретные услуги, вызывая соответствующие методы объекта класса делегата.
Согласно периоду создания агента, классы агентов можно разделить на два типа.
• Статический прокси: создан программистами или автоматически генерирует исходный код с помощью конкретных инструментов, а затем компилирует его. Перед запуском программы файл .class класса прокси уже существует.
• Динамический прокси: когда программа работает, байт -код динамически генерируется механизмом отражения Java.
2.1 Статический прокси
Общественный интерфейс count {public void QueryCount ();} публичный класс DextMpl реализует count {public void QueryCount () {System.out.println ("Просмотр учетной записи ..."); }} // Proxy Class Public Class Countproxy реализует count {private sturettimpl dectimpl; public countproxy (dectimpl decttimpl) {this.countimpl = decttimpl; } @Override public void QueryCount () {System.out.println ("Перед обработкой транзакций"); deftimpl.querycount (); // Вызовите метод класса делегатов; System.out.println («После обработки транзакций»); }} // Тестовый класс публичный класс testCount {public static void main (string [] args) {decttimpl gusttimpl = new gusttimpl (); Countproxy countproxy = new countproxy (dectimpl); countproxy.querycount (); }}Соблюдайте код и обнаружите, что каждый класс прокси может служить только один интерфейс, так что слишком много прокси неизбежно произойдет в разработке программы. Более того, все прокси -операции, за исключением различных методов вызова, все остальные операции одинаковы, поэтому код должен повторяться в настоящее время. Лучший способ решить эту проблему - выполнить все прокси -функции через класс прокси, так что это должно быть сделано с помощью динамического прокси в настоящее время.
2.2 Динамический агент
Байт -код класса динамического прокси -сервера динамически генерируется механизмом отражения Java при запуске программы, без необходимости вручную программистов писать свой исходный код. Динамические прокси -классы не только упрощают программирование, но и улучшают масштабируемость программных систем, поскольку механизм отражения Java может генерировать любой тип динамических прокси -классов.
2.2.1 JDK Dynamic Proxy
Интерфейсы класса Proxy и InvocationHandler в пакете java.lang.reflect обеспечивают возможность генерировать динамические прокси -классы.
InvocationHandler интерфейс:
публичный интерфейс vlocationhandler {
public Object invoke (Proxy объекта, метод метода, объект [] args) бросает выбрасывание;
}
Описание параметра:
Прокси -сервер объекта: относится к тому, что объект находится доверенным.
Метод метода: метод, который должен быть вызван
Object [] args: параметры, требуемые при вызове метода
Вы можете думать о подкласке интерфейса vocationHandler как о последнем классе операции прокси, заменив ProxySubject.
Класс прокси:
Класс прокси - это операционный класс, который специализируется на прокси. Он может динамически генерировать классы реализации для одного или нескольких интерфейсов через этот класс. Этот класс предоставляет следующие методы работы:
Общественный статический объект NewProxyInstance (ClassLoader Loader, Class <?> [] Интерфейсы, volcocationHandler h) бросает нелегальные
Описание параметра:
Загрузчик класса: загрузчик класса
Класс <?> [] Интерфейсы: Получите все интерфейсы
InvocationHandler H: получить экземпляр подкласса интерфейса vocationHandler
Если вы хотите завершить динамический прокси, вам сначала необходимо определить подкласс интерфейса InvocationHandler, чтобы завершить конкретную работу прокси.
Интерфейс субъект {public String Speak (String name, int age);} класс RealSubject реализует субъект {@Override public String Specing (String name, int age) {return name + "" + age; }} // jdk dynamic proxy class myinvocation handler реализует vocationhandler {private object target = null; // Привязан объект делегата и вернуть Proxy Class Public Object Bind (объект цели) {this. target = target; return proxy.newproxyinstance (target.getClass (). getClassLoader (), target.getClass (). getInterfaces (), это); // Связывать интерфейс (CGLIB создает это)} @Override Public Object Invoke (Proxy Object, метод метода, объект [] args) бросает Throwable {System.out.println ("Перед методом!"); Объект Temp = method.invoke (Target, args); System.out.println ("После метода!"); вернуть температуру; }} класс hello {public static void main (string [] args) {myInvocation handler demo = new myInvocationHandler (); Субъект sub = (субъект) demo.bind (new RealSubject ()); String info = sub.say ("Rollen", 20); System.out.println (info); }} Тем не менее, динамический прокси JDK опирается на реализацию интерфейса. Если некоторые классы не реализуют интерфейсы, они не могут использовать прокси JDK, поэтому им необходимо использовать динамический прокси CGLIB.
2.2.2 Dynamic CGLIB Dynamic Proxy
Динамический прокси -механизм JDK может только прокси -классы, которые реализуют интерфейсы, в то время как классы, которые не реализуют интерфейсы, не могут реализовать динамический прокси JDK.
CGLIB реализует прокси для занятий. Его принцип состоит в том, чтобы генерировать подкласс для указанного целевого класса и переопределить улучшение реализации метода. Однако, поскольку используется наследование, окончательный модифицированный класс не может быть доверен.
Public Interface Bookfacade {public void addBook (); } открытый класс bookfacadeimpl1 {public void addBook () {System.out.println («Обычный метод для добавления книг ...»); }} импортировать java.lang.reflect.method; Импорт net.sf.cglib.proxy.enhancer; Импорт net.sf.cglib.proxy.methodinterceptor; Импорт net.sf.cglib.proxy.methodproxy; // CGLIB Dynamic Proxy Class Public Class Bookfacadecglib реализует MethodInterceptor {Private Object Target; // Привязан объект делегата и вернуть Proxy Class Public Object GetInstance (объект цели) {this.Target = target; Enhancer Enhancer = новый Enhancer (); Enhancer.setSuperClass (this.Target.getClass ()); // метод обратного вызова Enhancer.setCallback (this); // Создать прокси -объект return Enhancer.create (); } @Override // Метод обратного вызова публичного объекта перехват (объект obj, метод метода, объект [] args, methodproxy proxy) throws {system.out.println ("function start"); Object Temp = proxy.invokesuper (obj, args); System.out.println ("function end"); вернуть температуру; }} public Class testcglib {public static void main (string [] args) {bookfacadecglib cglib = new bookfacadecglib (); Bookfacadeimpl1 bookcglib = (bookfacadeimpl1) cglib.getinstance (new bookfacadeimpl1 ()); bookcglib.addbook (); }}Приведенное выше краткое обсуждение Java Reflection и Proxy - это весь контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.