Java静态代理和动态代理的简单代码实现。

来源:互联网 发布:java数组按大小排序 编辑:程序博客网 时间:2024/05/29 19:51

静态代理:

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


原创粉丝点击