动态代理-初级篇
来源:互联网 发布:淘宝商品详情页图片 编辑:程序博客网 时间:2024/05/17 03:13
最近想总结一下java的动态代理,动态代理有很多种实现方案,下面介绍三种最常用的动态搭理方案:1.jdk自带动态代理2.javassist实现动态代理3.cglib实现动态代理
接口和实现类代码:
package com.java.day1.dynamicproxy.one;public interface Interface {void doSomeThing();}
package com.java.day1.dynamicproxy.one;public class RealSubject implements Interface{@Overridepublic void doSomeThing() {System.out.println("do some things..");}}
jdk自带动态搭理实现
package com.java.day1.dynamicproxy.one;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class JdkProxyHandler implements InvocationHandler{// 这个就是我们要代理的真实对象 private Object subject; // 构造方法,给我们要代理的真实对象赋初值 public JdkProxyHandler(Object subject) { this.subject = subject; }@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("do otherthings..jdk..");return method.invoke(subject, args); }}
package com.java.day1.dynamicproxy.one;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class JdkTest {public static void main(String[] args) {//被代理的类RealSubject rs = new RealSubject();// 代理增强类InvocationHandler ih = new JdkProxyHandler(rs);// 用java反射生成代理类Interface proxy = (Interface) Proxy.newProxyInstance(ih.getClass().getClassLoader(), rs.getClass().getInterfaces(), ih);proxy.doSomeThing();}}
javassist实现动态代理
package com.java.day1.dynamicproxy.one;import java.lang.reflect.Method;import javassist.util.proxy.MethodHandler;public class JavassitInterceptor implements MethodHandler{private Object subject;public JavassitInterceptor(Object subject){this.subject = subject;}@Overridepublic Object invoke(Object self, Method m, Method prosess, Object[] args) throws Throwable {System.out.println("do other thing..javassist.");return m.invoke(subject, args);}}
package com.java.day1.dynamicproxy.one;import javassist.util.proxy.ProxyFactory;import javassist.util.proxy.ProxyObject;public class javassistTest {public static void main(String[] args) throws Exception {//被代理的类RealSubject rs = new RealSubject();// 代理增强类JavassitInterceptor ih = new JavassitInterceptor(rs);// 用javassist反射生成代理类 ProxyFactory pf = new ProxyFactory(); pf.setInterfaces(rs.getClass().getInterfaces()); Class<?> proxyClass = pf.createClass(); Interface proxy = (Interface) proxyClass.newInstance(); ((ProxyObject)proxy).setHandler(ih); proxy.doSomeThing(); }}
cglib实现动态搭理
package com.java.day1.dynamicproxy.one;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibInterceptor implements MethodInterceptor {private Object subject;public CglibInterceptor(Object subject){this.subject = subject;}@Overridepublic Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("do other things..cglib...");return methodProxy.invoke(subject, objects);}}
package com.java.day1.dynamicproxy.one;import net.sf.cglib.proxy.Enhancer;public class CgligTest {public static void main(String[] args) {//被代理的类RealSubject rs = new RealSubject();// 代理增强类 Enhancer enhancer = new Enhancer(); CglibInterceptor ci = new CglibInterceptor(rs); enhancer.setCallback(ci); enhancer.setInterfaces(rs.getClass().getInterfaces()); Interface proxy = (Interface)enhancer.create(); proxy.doSomeThing();}}
我还做了实验,但从创建来看jdk是最快的cglib最慢,但创建好后调用,javassist最快,jdk次之,不过是同一个数量级的,cglib最慢比其他2种慢5倍
0 0
- 动态代理-初级篇
- 转载一个对于初级动态代理的生动理解
- UI初级--代理模式
- MapReduce基础篇-动态代理
- 代理-->静态代理&动态代理
- 动态规划初级题解
- 动态规划初级
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- C#中MessageBox.Show的用法【申明:来源于网络】
- PHP7连接sql server
- Elasticsearch 单机简单安装及常用查询命令
- jvm第8节-解析class文件
- jvm第9节-asm生成class字节码
- 动态代理-初级篇
- python-libs-2.6.6-66.el6_8.x86_64 is a duplicate with python-libs-2.6.6-64.el6.x86_64
- (转)ViewPager中切换界面Fragment被销毁的问题分析
- zookeeper学习笔记-基本用法介绍
- zookeeper学习笔记-基本用法进阶
- 2多线程断点下载一个文件(普通的java工程:java实现)
- zookeeper学习笔记-zookpeeper集群
- java学习记录
- Jfinal下使用ckeditor实现上传功能