JAVA 动态代理

代理设计模式

定义:为其他对象提供一种代理以控制对这个对象的访问。

动态代理的使用

  • 动态代理类都必须要实现InvocationHandler接口,当我们在调用代理对象的方法的时候,这个方法的调用就会被转发到由InvocationHandler的invoke方法来进行调用。
  • 看一下InvocationHandler接口中的invoke方法。
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
proxy:  指代我们所代理的那个真实对象
method:  指代的是我们所要调用真实对象的某个方法的Method对象
args:  指代的是调用真实对象某个方法时接受的参数```
  • 还有Proxy类,这个类的主要作用就是用来动态创建一个代理对象,使用最多的就是newProxyInstance方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler invocationHandler)
            throws IllegalArgumentException
loader:  代理类的ClassLoader,定义由那个对象来生成代理对象
interfaces: 一组接口数组,代理对象实现的接口
invocationHandler :一个In从cationHandler对象,表示和那个对象进行关联

动态代理实例

  1. 先创建一个接口Subject,定义一个方法doSomething();
public interface Subject   
{   
  public void doSomething();   
}  
  1. 创建一个具体的实现类,真是一个真实的对象RealSubject
public class RealSubject implements Subject   
{   
  public void doSomething()   
  {   
    System.out.println( "call doSomething" );   
  }   
}  
  1. 创建一个动态代理类,都需要实现invocationHandler。
public class MyInvocationHandler implements InvocationHandler {
    private Object proxyedObj;//代理的对象
    MyInvocationHandler(Object obj) {
        proxyedObj=obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //调用具体对象方法前,处理一些业务
        System.out.println( "before call doSomething " ); 
        //转调具体目标对象的方法 
        Object result =method.invoke(proxyedObj,args);
        //在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("after call doSomething");
        return result;
    }
}
  1. 创建一个测试程序
    RealSubject real = new RealSubject();   
    Subject proxySubject = (Subject)Proxy.newProxyInstance(real.getClass().getClassLoader(), 
     new Class[]{Subject.class}, 
     new ProxyHandler(real));
     System.out.println(proxySubject.getClass().getName());//$Proxy*
    proxySubject.doSomething();
  1. 通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值