您的位置:首页 > 编程语言 > Java开发

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()进行相应的处理。

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