今天看了下java动态代理的源码,YY下实现,有错请指出
Java动态代理需要实现接口。为什么,Java是这么做的:
Java会根据需要代理类所实现的所有接口,创造一个实现了同样接口的Class对象,并通过类加载器加载。
这个类的构造器需要传入我们实现了InvocationHandler代理类。
当代理类调用接口的方法时,其实是用InvocationHandler.invoke,来实现。
举例:
类A implements B
B有一个方法handleb(String string);
动态代理类C
当B b = C.bind(A)的时候,Proxy会生成一个实现了B的代理类P,并缓存起来。再用P实例化一个B的实例。
P的构造器需要一个C的实例。
P的handleb(String s)方法是这么实现的(YY的)
handleb(String s){
c.invike(c,method,s);
}
c.invike(c,method,s);
c就是P类实例构造时候传入的C实例,也就是我们bind得到的代理类。(验证过)
method是B的handleb方法对应的Method实例。
测试代码:
public interface Sad { void sad(); }
public class SadImpl implements Sad, Inter1 { @Override public void sad() { System.out.println("桑心"); } }
public class DynamicProxy implements InvocationHandler { private Object target; public static Object p; public static Method m; /** * 绑定委托对象并返回一个代理类 * * @param target * @return */ public Object bind(Object target) { this.target = target; // 取得代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); // 要绑定接口(这是一个缺陷,cglib弥补了这一缺陷) } @Override /** * 调用方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("动态代理前"); // 执行方法 p = proxy.getClass(); m = method; result = method.invoke(target, args); System.out.println("动态代理后"); return result; } }
测试类:
@Test public void testDynamicProxy() throws SecurityException, NoSuchMethodException { DynamicProxy proxy = new DynamicProxy(); Sad sad = (Sad) proxy.bind(new SadImpl()); sad.sad(); System.out.println(sad.getClass() == DynamicProxy.p);//true System.out.println(Sad.class.getMethods()[0].equals(DynamicProxy.m));//true System.out.println(Sad.class.getMethods()[0]);//public abstract void cn.teaey.test.proxy.Sad.sad() System.out.println(DynamicProxy.m);//public abstract void cn.teaey.test.proxy.Sad.sad() }
相关推荐
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。
java动态代理资源
自己总结的代理模式和Java中的动态代理模式,有源码
Java动态代理实现数据源连接池,用代理类实现的连接池代码,绝对完整的案例,下载源码就能跑起来!Java动态代理实现数据源连接池,用代理类实现的连接池代码
java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用
java动态代理项目源代码以及*.class文件反汇编工具,可以下载学习
java的代理Http实现源代码,有2钟,看谁有时间的话,可以改写一下
使用Java编写的反向代理程序(源代码),通过简单的参数配置即可实现某些特定站点的反向代理,并在此过程中改变一些站点的特定行为。例如:允许特点站点跨域访问被代理的站点,或者屏蔽被代理站点识别请求访问客户端...
NULL 博文链接:https://changaiqing.iteye.com/blog/1487140
java static proxy dynamic proxy
动态生成PDF.动态生成PDF. java 源码
java源码学习比较java源码学习比较
NULL 博文链接:https://xueyue.iteye.com/blog/1202897
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
java 动态代理Proxy应用和底层源码分析.pdf
HTTP代理服务器java 简单网站过滤
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)
java动态编译源码并调用的三种方式,全部包含在内,并且有文档说明,还是相当不错的。