静态代理:
package com.text.sgl;
/*** 静态代理* @author shen.guoliang* @version 1.0, 2017年8月27日 每次修改后更新版本号,日期和修改内容* @see [相关类/方法]* @since [产品/模块版本]*/
interface ClothFactory{//制作衣服public void dowork();
} //被代理对象
class NakeCloth implements ClothFactory{@Overridepublic void dowork() {System.out.println("耐克生产的衣服!"); }}//代理类
class DailiCloth implements ClothFactory{NakeCloth nc;@Overridepublic void dowork() {nc.dowork();}public DailiCloth(NakeCloth nc){this.nc = nc;}
}public class StaticText {public static void main(String[] args) {NakeCloth nc = new NakeCloth();DailiCloth dc = new DailiCloth(nc);dc.dowork();}
}
动态代理:
package com.text.sgl;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 反射机制动态代理实例* @author shen.guoliang* @version 1.0, 2017年8月27日 每次修改后更新版本号,日期和修改内容* @see [相关类/方法]* @since [产品/模块版本]*/
//动态代理的使用
//(这是将被实现的接口实例)
interface Subject{//抽象方法void action();
}//被代理类
class RealSubject implements Subject{@Overridepublic void action() {System.out.println("我是被代理类,记得执行我奥!");}
} //实现InvocationHandler接口的对象,用来动态生成代理类的对象等
class MyInvocationHandler implements InvocationHandler{Object obj;//实现了接口的被代理类对象的声明//1:给被代理类对象实例化 2:返回一个代理类对象public Object blind(Object obj){this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); }//当通过代理类的对象发起被重写的方法的调用时,都会转换为对如下的invoke方法的调用@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//method方法的返回值是valueObject value = method.invoke(obj, args);return value;}}public class TestProxy {public static void main(String[] args) {//创建一个被代理类对象RealSubject rs = new RealSubject();//创建一个实现了InvocationHandler接口的自动生成代理类工具类对象MyInvocationHandler mh = new MyInvocationHandler();//调用blind()方法,动态返回一个实现Subject接口的代理类对象Object obj = mh.blind(rs);//强转Subject sbj = (Subject)obj;//执行action()方法其实转到对InvocationHandler接口的实现类的invoke()方法的调用,实际还是调的被代理对象重写的action()的方法,从而实现动态代理sbj.action();}
}