Java reflection mechanism dynamic proxy

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();

    }

}

result:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326268927&siteId=291194637
Recommended