JDK动态代理【2】DEMO以及效率比较

就用设计模式中的概念引入一个Demo吧,Demo的作用主要是要了解代理的使用方法和需要使用的类及接口。


关系图

1.Subject接口

public interface Subject {

    public void request();

}

2.RealSubject实现(委托类)

public class RealSubject implements Subject{

@Override

        public void request() {

                System.out.println("call method1");

        }

}

3.自定义的实现InvocationHandler的MyInvalcationHandler<T>

public class MyInvalcationHandler<T> implements InvocationHandler {

        T target;

        public MyInvalcationHandler(T target) {

           this.target = target;

        }

        @Override

        public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {

                System.out.println("call invoke start");

                return arg1.invoke(target, arg2);

        }

}

4.具体调用

public static void main(String[] args){

        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        System.out.println("run");

        Subject subject = new RealSubject();

        InvocationHandler handler = new MyInvalcationHandler<Subject>(subject);

        Subject p = (Subject)Proxy.newProxyInstance(Person.class.getClassLoader(),

        new Class<?>[]{Subject.class}, handler);

        p.request();

}

4.说明

生成的代理类传入了InvocationHandler ,在代理类调用request方法时,request方法会调用handler的invoke方法,invoke方法中可以嵌入自己想要嵌入的代码,同时通过传入的参数调用到委托类中request方法的具体实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陈阿飞阅读 882评论 1 1
  • 背景:学习spring的AOP或者EasyMock的源码时,需要对java的动态代理有深刻的了解 关于cglib的...
    测试你个头阅读 780评论 0 1
  • Spring的核心AOP的原理就是java的动态代理机制。所以,我们需要好好将java动态代理机制进行梳理。 ...
    守住阳光阅读 274评论 0 0
  • 当我谈跑步时, 我谈些什么? 诚实地书写跑步, 某种程度上, 也就是诚实地书写我这个人。 ...
    Nuisance阅读 218评论 0 0
  • 儿子快一岁半了,最近咬人特别厉害。我发现他就是一阵一阵的,有几天就不咬人就忘记了,有几天就咬人,记不住,我让他慢慢...
    曦宝阅读 318评论 0 1