Java动态代理

所谓动态代理,就是在程序运行时生成代理类,而无需像静态代理那样一个个得编写代理类,动态代理的实现方式比较多:有java代理、CGlib代理、ASM库等等。依次了解一下。

Java动态代理

InvocationHandler接口

Java动态代理需要代理类实现InvocationHandler接口,当我们通过代理类调用一个方法时,这个方法就会被转发给代理类的invoke方法来调用,InvocationHandler接口只有一个方法:

public Object invoke(Object realSubject,Method method,Objects[] args)throw Throwable;

realSubject是委托对象,method是该对象被调用的方法,args是调用该方法需要传入的参数。

java.lang.reflect.Proxy

该类时Java动态代理的生成器,提供了以下静态方法用以生成代理类:

/**根据传入的类加载器、接口实现代理类**/
public static Class getProxyClass(ClassLoader loader,Class<?>  interfaces);
/**根据传入的类加载器、接口,调用处理器动态生成代理类**/
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h);
/**根据传入的代理类获取其对应的调用处理器**/
public static InvocationHandler getInvocationHandler(Object proxy);
例程:
public interface Vehicle{
    public void move();
}
public class Car{
    public void move(){
        system.out.println("The car is moving..." );
    }
}
public class ProxyCar implements InvocationHandler{
    private Object proxies;
    public ProxyCar(Object proxies){
        this.proxies=proxies;
    }
    /**invoke方法的参数还是很好记忆的,就是被代理的对象,需要调用的方法,方法所需参数**/
    public Object invoke(Object proxies,Method method,Object[] args)throws Throwable{
        Object result=null;
        /**此处可以进行方法调用前预处理**/
        result=method.invoke(proxies,args);
        /**此处可以进行方法调用后置处理**/
        return result;
    }
}

   public class Drive{
    public static void main(String[] args){
        Car car=new Car();
            Vehicle vehicle=        Proxy.newProxyInstance(Vehicle.class.getClassLoader,new Class[]{Vehicle.class},new ProxyCar(car));
            car.move();
    }
}

//TODO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值