动态代理+类的生命周期

目标

通过一个代理类完成全部的代理功能,需要使用动态代理完成
动态代理机制: java.lang.reflect.InvocationHandler,java.lang.reflect.Proxy类的支持

public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

在此接口中只定义了一个invoke( )方法,3个参数的意义:

参数意义
Object proxy被代理的对象
Method method要调用的方法
Object args[]方法调用时所需要的参数

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。Proxy类提供了如下的操作方法:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException 
参数意义
ClassLoader loader类加载器
Class[] interfaces得到全部接口
InvocationHandler h得到InvocationHandler接口的子类实例
// 取得类加载器
Person per = new Person();
System.out.print("类加载器:"+per.getClass().getClassLoader().getClass().getName());
// sun.misc.Launcher$AppClassLoader

下面实现动态代理

// 定义MyInvocationHandler
public class MyInvocationHandler implements InvocationHandler {
    private Object obj;

    public Object bind(Object obj){
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
                                      obj.getClass().getInterfaces(),
                                      this);// 取得代理对象
    }

    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
        Object temp = method.invoke(this.obj, args);
        return temp;
    }
}

在MyInvocationHandler类的bind( )方法中接收被代理对象的真实主题实现,之后覆写InvocationHandler接口中的invoke( )方法,完成具体的方法调用

// 定义接口
public interface Subject {
    public String say(String name, int age);
}
// 定义真实主题实现类
public class RealSubject implements Subject {
    public String say(String name, int age) {
        return "姓名:"+name+", 年龄"+age;
    }
}
// 测试动态代理
main(String[] args) {
    MyInvocationHandler handler = new MyInvocationHandler();
    Subject sub = (Subject)handler.bind(new RealSubject());
    String info = sub.say("张三", 120);
    System.out.print(info);
}

类的生命周期

类的生命周期

图中有好几个错别字/汗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值