JAVA动态代理实例
2017-02-18 20:46
253 查看
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
可以基于反射技术采用Java JDK提供的相应机制实现动态代理模式。
当有多个真实主题对象时,只需要一个动态代理类即可,避免了创建多个静态代理类的麻烦。
可以在运行时根据实际需要为某个真实主题对象动态地创建一个代理对象,系统更加灵活。
缺点是效率低,比静态代理慢一点,可读性差,不好理解。
JDK动态代理只能对实现了接口的类进行代理。
Proxy类。该类即为动态代理类,该类最常用的方法为:
public static Object newProxyInstance (ClassLoader loader, Class<?>[]interfaces,
InvocationHandler h) throws IllegalArgumentException;
该方法根据传入的参数返回一个动态创建的代理类对象,方法中第一个参数loader表示主题类(目标类)的类加载器,第二个参数interfaces表示主题类(目标类)的接口列表,第三个参数h表示调用处理程序对象,所有对代理类对象方法的调用都被委托给对象h,由对象h的invoke()进行相应的处理。
可以基于反射技术采用Java JDK提供的相应机制实现动态代理模式。
当有多个真实主题对象时,只需要一个动态代理类即可,避免了创建多个静态代理类的麻烦。
可以在运行时根据实际需要为某个真实主题对象动态地创建一个代理对象,系统更加灵活。
缺点是效率低,比静态代理慢一点,可读性差,不好理解。
JDK动态代理只能对实现了接口的类进行代理。
Proxy类。该类即为动态代理类,该类最常用的方法为:
public static Object newProxyInstance (ClassLoader loader, Class<?>[]interfaces,
InvocationHandler h) throws IllegalArgumentException;
该方法根据传入的参数返回一个动态创建的代理类对象,方法中第一个参数loader表示主题类(目标类)的类加载器,第二个参数interfaces表示主题类(目标类)的接口列表,第三个参数h表示调用处理程序对象,所有对代理类对象方法的调用都被委托给对象h,由对象h的invoke()进行相应的处理。
public interface AbstractSubject { public void request(); }
public class RealSubjectA implements AbstractSubject { public void request() { System.out.println("真实主题类A!"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler { private Object obj; public DynamicProxy(){} public DynamicProxy(Object obj) { this.obj=obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { preRequest(); method.invoke(obj, args); postRequest(); return null; } public void preRequest(){ System.out.println("调用之前!"); } public void postRequest(){ System.out.println("调用之后!"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Client { public static void main(String args[]) { InvocationHandler handler =null; AbstractSubject subject=null; handler=new DynamicProxy(new RealSubjectA()); subject=(AbstractSubject)Proxy.newProxyInstance(AbstractSubject.class.getClassLoader(), new Class[]{AbstractSubject.class}, handler); subject.request(); System.out.println("------------------------------"); handler=new DynamicProxy(new RealSubjectB()); subject=(AbstractSubject)Proxy.newProxyInstance(AbstractSubject.class.getClassLoader(), new Class[]{AbstractSubject.class}, handler); subject.request(); } }
相关文章推荐
- java动态代理简单实例
- java使用动态代理来实现AOP(日志记录)的实例代码
- java学习之路 之 反射机制综合练习题、动态代理实例
- Java动态代理实例
- Java反射和动态代理详解和实例
- Java静态代理、动态代理实例
- java反射中的动态代理机制(有实例)
- Java代理(jdk静态代理、动态代理和cglib动态代理)实例及总结
- java实现动态代理代码实例(死循环溢出的问题的解决)
- java 中动态代理(JDK,cglib)实例代码
- java jdk动态代理 实例 简单明了 对初学者非常有效
- Java反射和动态代理详解和实例
- java动态代理实例
- Java动态代理分析及简单实例
- Java静态代理、动态代理实例
- java动态代理简单实例。
- java动态代理简单实例
- java使用动态代理来实现AOP(日志记录)的实例代码
- Java中反射动态代理接口的详解及实例
- Java动态代理简单实例:老板与秘书