JDK动态代理-Proxy.newProxyInstance

文章出处:https://www.cnblogs.com/wobuchifanqie/p/9991342.html
注释写的很到位

示例业务逻辑:

1-娱乐明星都会唱歌、演习(interface Star)
2-有一个明星叫胡歌(class HuGe implements Star)
3-他有两个助理(分别对应两个代理类)(class HuGeProxy1、class HuGeProxy2)
4-如果要找胡歌唱歌、演戏,需要先找两个助理中的一个,然后助理去找胡歌唱歌、演戏(class ProxyTest)

定义一个明细接口
public interface Star {

void sing(String song);//唱歌

String act(String teleplay);//表演

}

创建胡歌类-实现明细接口
public class HuGe implements Star{

public void sing(String song) {
    System.out.println("胡歌演唱: " + song);
}

public String act(String teleplay) {
    System.out.println("胡歌决定出演电视剧: " + teleplay);
    return "胡歌答应出演电视剧: " + teleplay;
}

}

胡歌代理类1
//使用一个匿名内部类来实现该接口实现InvocationHandler接口,实现invoke方法
public class HuGeProxy1 {

private Star hg = new HuGe();//实例化一个对象

public Star getProcxy(){
    //使用Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)返回某个对象的代理对象
    /**
     * ClassLoader loader:Java类加载器; 可以通过这个类型的加载器,在程序运行时,将生成的代理类加载到JVM即Java虚拟机中,以便运行时需要!
     * Class<?>[] interfaces:被代理类的所有接口信息; 便于生成的代理类可以具有代理类接口中的所有方法
     * InvocationHandler h:调用处理器; 调用实现了InvocationHandler 类的一个回调方法
     * */
    return (Star)Proxy.newProxyInstance(
            getClass().getClassLoader(), 
            hg.getClass().getInterfaces(), 
            new InvocationHandler() {
                /**
                  * InvocationHandler接口只定义了一个invoke方法,因此对于这样的接口,我们不用单独去定义一个类来实现该接口,
                  * 而是直接使用一个匿名内部类来实现该接口,new InvocationHandler() {}就是针对InvocationHandler接口的匿名实现类
                  */
                 /**
                  * 在invoke方法编码指定返回的代理对象干的工作
                  * proxy : 把代理对象自己传递进来 
                  * method:把代理对象当前调用的方法传递进来 
                  * args:把方法参数传递进来
                  * 
                  * 当调用代理对象的star.sing("逍遥叹");或者 star.act("琅琊榜")方法时,
                  * 实际上执行的都是invoke方法里面的代码,
                  * 因此我们可以在invoke方法中使用method.getName()就可以知道当前调用的是代理对象的哪个方法
                  */
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    
                    if(method.getName().equals("sing")){
                        System.out.println("我是胡歌代理1,找胡歌唱歌找我");
                        return method.invoke(hg, args);
                    }
                    if(method.getName().equals("act")){
                        System.out.println("我是胡歌代理1,找胡歌演电视剧找我");
                        return method.invoke(hg, args);
                    }
                    
                    return null;
                }
            });
}

}

胡歌代理类2
//实现InvocationHandler接口,实现invoke方法
public class HuGeProxy2 implements InvocationHandler{

private Star hg = new HuGe();

public Star getProcxy(){
    return (Star)Proxy.newProxyInstance(
            getClass().getClassLoader(), 
            hg.getClass().getInterfaces(), 
            this);
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    if(method.getName().equals("sing")){
        System.out.println("我是胡歌代理2,找胡歌唱歌找我");
        return method.invoke(hg, args);
    }
    if(method.getName().equals("act")){
        System.out.println("我是胡歌代理2,找胡歌演电视剧找我");
        return method.invoke(hg, args);
    }
    
    return null;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值