创建代理类
//JDK 提供的动态代理 ,只能代理接口 ,不能代理类 。cglib 能代理类 。
public class DynamicProxy implements InvocationHandler{
//声明一个对象 ,这个对象 就是用来表示 被代理类 。
private Object obj;
//传入被代理对象 。
public Object getProxy(Object obj){
this.obj = obj;
//生成代理对象 。
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
check();
beforeLogging();
Object returnValue = method.invoke(obj, args);
afterLoggging();
return returnValue;
}
public void beforeLogging(){
System.out.println("事前日志 。");
}
public void afterLoggging(){
System.out.println("事后日志。");
}
public void check(){
System.out.println("安全检查。");
}
}
obj.getClass().getClassLoader():拿到对象所有的加载器
obj.getClass().getInterfaces():拿到对象所有的构造器
定义两个接口,并为其创建实体类
public class PanMeiNv implements MeiNv {
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("和潘美女玩 。。。");
}
}
@Override
public void mai() {
// TODO Auto-generated method stub
System.out.println("上海的房子要卖。2亿。");
}
定义一个主方法
public static void main(String[] args) {
//创建被代理对象
//PanMeiNv pan = new PanMeiNv();
//创建代理类.
/*DynamicProxy dp = new DynamicProxy();
*通过getProxy方法拿到代理对象.
*object proxy = dp.getProxy(pan);
*把代理对象强转成美女类型.
*MeiNv mv = (MeiNv)proxy;
*mv.play();
*
* */
//流程痕迹
//创建被代理对象
ShangHaiFang sh = new ShangHaiFang();
DynamicProxy dp = new DynamicProxy();
Object proxy = dp.getProxy(sh);
Fang f = (Fang) proxy;
f.mai();
}
}
输出结果:
安全检查。
事前日志 。
上海的房子要卖。2亿。
事后日志。
网友评论