|
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
喝个咖啡,先把衣服穿上
写代码...
衣服脱了,继续喝咖啡 |
|