JAVA动态代理实例

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为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();
	} 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值