比较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源码里有,有空整理下,哈哈哈。