动态代理代码示例

来源:互联网 发布:erp沙盘软件 编辑:程序博客网 时间:2024/05/21 11:08

11320171026

实现动态代理的两种方式:

   1、JDK:目标类强制实现某个接口【反射】

   2、cglib:目标类可以不必实现接口【字节码,效率高】

package com.tiger.proxy;import java.lang.reflect.Method;import com.tiger.bean.Tiger;import net.sf.cglib.proxy.*;/** * 动态代理 cglib实现 * @author tiger * @date 2017年10月25日 */public class MyProxy_cglib implements MethodInterceptor {long start;long end;/** *  参数一:目标对象 *  参数二:目标方法 *  参数三:目标方法的参数 *  参数四:代理方法的对象 */@Overridepublic Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {//前置处理before(method.getName());//核心逻辑方法Object result=proxy.invokeSuper(target, args);//后置处理after();return result;}/*------ 中介下需要做的事情 start------*//** * 前置处理 * @param method */private void before(String method){System.out.println("正在执行:"+method);start = System.currentTimeMillis();//1s=1000ms}/** * 后置处理 */private void after(){end = System.currentTimeMillis();System.out.println("共花费了:"+(end - start)+"毫秒");}/*------ 中介下需要做的事情 end------*//** * 测试 * @param args */public static void main(String[] args) {Enhancer enhancer  = new Enhancer();//注入目标类enhancer.setSuperclass(Tiger.class);//拦截器对象MyProxy_cglib proxy = new MyProxy_cglib();//设置回调方法enhancer.setCallback(proxy);Tiger obj = (Tiger) enhancer.create();//Animal obj = (Animal) enhancer.create();obj.eat();}}package com.tiger.proxy;import java.lang.reflect.*;import com.tiger.bean.*;import com.tiger.bean.Tiger;/** * 动态代理 jdk实现 * @author tiger * @date 2017年10月25日 */public class MyProxy_jdk implements InvocationHandler{private Object target; //目标对象 -- 真实对象long start;long end;/** * 创建一个代理类,便于client获取。 * @return */public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}/** * 参数一:目标对象 * 参数二:目标方法 * 参数三:目标方法的参数 */@Overridepublic Object invoke(Object target, Method method, Object[] args)throws Throwable {before(method.getName());//核心逻辑Object result = method.invoke(target, args);after();return result;}/*------ 中介下需要做的事情 start------*//** * 前置处理 * @param method */private void before(String method){System.out.println("正在执行:"+method);start = System.currentTimeMillis();//1s=1000ms}/** * 后置处理 */private void after(){end = System.currentTimeMillis();System.out.println("共花费了:"+(end - start)+"毫秒");}/*------ 中介下需要做的事情 end------*/public void setTarget(Object target) {this.target = target;}public MyProxy_jdk() { }public MyProxy_jdk(Object target) {this.target = target;}/** * 测试 * @param args */public static void main(String[] args) {//动物的具体实现类//Car obj = new Car();Tiger obj = new Tiger();//Dog obj = new Dog();MyProxy_jdk proxy = new MyProxy_jdk(obj);//代理类Animal animal= (Animal) proxy.getProxy();//获取得到代理类接口animal.eat();}}

原创粉丝点击