jdk、cglib动态代理

JAVA 动态代理模式

Jdk动态代理

仅支持对实现了同一接口的类进行代理

 

创建一个被代理类的接口:

public interface Moveable {

       void move();

       void stop();

}

 

创建被代理类接口的实现

public class Car implements Moveable {

       @Override

       public void move() {

              System.out.println("汽车行驶中...");

       }

       @Override

       public void stop() {

              System.out.println("汽车停止行驶...");

       }

}

 

创建日志功能的代理类

public class ProxyHandler implements InvocationHandler{

       private Object obj;

       public ProxyHandler(Object obj){

              this.obj = obj;

       }

       @Override

       public Object invoke(Object proxy, Method method,Object[] args)

                     throws Throwable {

             

              System.out.println("日志开始...");

              Objecto = method.invoke(obj, args);

              System.out.println("日志结束...");

              return o;

       }

}

 

创建测试

public class Test {

       public staticvoid main(String[] args) {

              Carcar = newCar();

              Class<?>[]interfaces = car.getClass().getInterfaces(); 

              Moveablem=(Moveable) Proxy.newProxyInstance(Moveable.class.getClassLoader(),

                            interfaces,newProxyHandler(car));

              //m.move();

              m.stop();

       }

}

 

输出内容

测试成功

 

Cglib动态代理

能对任意类的任意方法实现代理,没有jdk动态代理的 必须实现同一接口的限制

需引入cglib.jar

 

创建被代理类

public class Train {

       public voidmove(){

              System.out.println("火车行驶中...");

       }

}

 

创建cglib日志代理类

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

 

public class CglibProxy implements MethodInterceptor{

       private Object object;

       public CglibProxy(Object object){

              this.object= object;

       }

      

       public Object Proxy(){

              //创建加强器

              Enhancerenhancer = newEnhancer();

              //设置需加强的类

              enhancer.setSuperclass(object.getClass());

              //设置回调

              enhancer.setCallback(this);

              enhancer.setClassLoader(object.getClass().getClassLoader());

              return enhancer.create();

       }

       @Override

       public Object intercept(Object arg0, Method arg1,Object[] arg2,

                     MethodProxyarg3) throwsThrowable {

              //对被代理类的加强

              System.out.println("日志开始...");

              Objecto = arg3.invokeSuper(arg0, arg2);

              System.out.println("日志结束...");

              return o;

       }

      

}

 

创建测试类

public class Test {

       public staticvoid main(String[] args) {

              CglibProxycglibProxy = newCglibProxy(new Train());

              TrainnewTrain = (Train) cglibProxy.Proxy();

              newTrain.move();

       }

}

 

输出内容

测试成功


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值