凯哥学堂

搜索

凯哥学堂

动态代理 [复制链接]

查看: 7562|回复: 0
打印 上一主题 下一主题

72

主题

72

帖子

594

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
594
跳转到指定楼层
楼主
发表于 2017-8-24 22:19:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Java反射机制动态代理

package com.kaige123;
/**
* 程序员
* @author 凯哥
*/
public interface Chengxuyuan {
        /**
         * 写代码方法
         */
        public void xiedaima();
}
package com.kaige123;
/**
* 程序员接口实现类
* @author 凯哥
*/
public class ChengxuyuanImpl implements Chengxuyuan {
        public void xiedaima() {
                System.out.println("写代码...");
        }
}
package com.kaige123;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 处理类
* @author 凯哥
*/
public class CxyHandler implements InvocationHandler {
       
        //程序员实现对象传递
        private Chengxuyuan c;
        public CxyHandler(Chengxuyuan c) {
                this.c = c;
        }
        /**
         * 程序员接口的方法只要被调用就会通知到吃方法上
         * @param proxy 代理对象
         * @param method 告诉你 调用的方法 封装对象
         * @param args 参数
         */
        public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                System.out.println("方法名称:"+method.getName());
                System.out.println("喝个咖啡,先把衣服穿上");
                Object obj=method.invoke(c, args);//调用方法
                System.out.println("衣服脱了,继续喝咖啡");
                return obj;
        }
}
package com.kaige123;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 测试类
* @author 凯哥
*
*/
public class Test {
        public static void main(String[] args) {
                //实现类对象
                ChengxuyuanImpl chengxuyuanImpl = new ChengxuyuanImpl();
                //得到反射类
                Class classs = chengxuyuanImpl.getClass();
                //创建处理类 然后把实现类对象传递
                CxyHandler handler = new CxyHandler(chengxuyuanImpl);
               
       
                //开始创建代理对象 然后把代理对象转换成接口类型
                Chengxuyuan chengxuyuan = (Chengxuyuan)
       
                                Proxy.newProxyInstance(
                                                classs.getClassLoader(),
                                                classs.getInterfaces(),
                                                handler);
                //调用方法  有如  >>>invoke(Object proxy, Method method, Object[] args)  >> xiedaima() >>调用完毕
                chengxuyuan.xiedaima();
      
        }

}


结果
方法名称:xiedaima
喝个咖啡,先把衣服穿上
写代码...
衣服脱了,继续喝咖啡
回复

使用道具 举报