Java动态代码

烈酒焚心 提交于 2019-12-02 19:21:15

比较C++和java ,后者是编译成java class文件,执行时动态生产java类,所以就有泛型时不能通过设置值就确定了具体的class类型,也有了动态生产可执行的方法和类,这里持续记录

---------------------------------

一 JDK动态代理

为了方便理解动态代理 ,我先一句话说明白静态代理:

就是代理类和被代理类都继承一个接口,代理类里有个被代理类的field,暴露给外界的时代理类,代理类的每个方法都执行一下代理的逻辑,再调用被代理类。

开始说jdk的动态代理,还是需要一个接口类,就是把原来代码里直接的 被代理类.方法()的调用方式, 换成了反射方式调用,代码的编写上少了许多,不需要每个方法都写一遍了。

 

 

二 cglib动态生成类来实现代理模式:

public class MainTest5 {    public static void main(String[] args)    {        if (true) {            Enhancer enhancer = new Enhancer();            enhancer.setSuperclass(OOMObject.class);            enhancer.setUseCache(false);            enhancer.setCallback(new MethodInterceptor() {                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {                    System.out.println("before doPrint");                    Object o =  proxy.invokeSuper(obj, args);                    System.out.println("after doPrint");                    return o;                }            });            Object o = enhancer.create();            ((OOMObject)(o)).doPrint();            ((OOMObject)(o)).doPrint2();        }    }    static class OOMObject { //没有static关键字 main方法里会报错        public void doPrint(){            System.out.println("doPrint");        }        public void doPrint2(){            System.out.println("doPrint2");        }    }}执行结果:

 

三 javaassist 动态生成类

    dubbo源码里有,有空整理下,哈哈哈。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!