JDK动态代理与CGLIB动态代理

记录:
        查询与理解.
1.JDK动态代理
        <1>.JDK动态代理需实现java.lang.reflect.InvocationHandler接口的invoke方法.
        <2>.JDK动态代理使用java.lang.reflect.Proxy类的newProxyInstance方法创建代理接口.
        <3>.JDK动态代理运行时需要接口,即传入的实例对象需要实现一个接口.
        综上:JDK动态代理的实现是在运行时,根据一组接口定义,使用Proxy,InvocationHandler等工具类去生成一个代理类和代理类实例.
2.CGLIB动态代理
        <1>.CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.
        <2>.CGLIB动态代理需要实现net.sf.cglib.proxy.MethodInterceptor接口的intercept方法
        <3>.CGLIB动态代理使用net.sf.cglib.proxy.Enhancer类的创建代理对象.
        <4>.CGLIB动态代理运行时只需实现类,无需接口.
3.JDK动态代理实例
3.1 接口Topic

public interface Topic {
  public void getInfo(String size);
}

3.2 接口实现类GirlTopic

public class GirlTopic implements Topic {
  @Override
  public void getInfo(String size) {
  	System.out.println("GirlTopic->GirlTopic开始......");
  	System.out.println("The girl is " + size +" cup.");
  	System.out.println("GirlTopic->GirlTopic开始......");
  }
}

3.3 InvocationHandler接口实现类

public class JdkTopicProxy implements InvocationHandler{
  private Object target;
  public JdkTopicProxy(Object target){
  	this.target = target;
  }
  @SuppressWarnings("unchecked")
  public <T> T getProxy(){
  	return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  }	
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  	System.out.println("JdkTopicProxy->invoke开始......");
      Object result = method.invoke(target, args);
      System.out.println("JdkTopicProxy->invoke结束......");
  	return result;
  }
}

3.4 测试main方法

public class TestJdkProxyDemo {
  public static void main(String [] args){
    System.out.println("测试开始......");
    // jdk动态代理测试
    Topic topic = new JdkTopicProxy(new GirlTopic()).getProxy();
    topic.getInfo("G");
    System.out.println("测试结束......");
  }
}

4.CGLIB动态代理
4.1 实现类GirlTopic

public class GirlTopic {
  public void getInfo(String size) {
  	System.out.println("GirlTopic->GirlTopic开始......");
  	System.out.println("The girl is " + size +" cup.");
  	System.out.println("GirlTopic->GirlTopic开始......");
  }
}

4.2 MethodInterceptor接口实现类

public class GirlMethodInterceptor implements MethodInterceptor{
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  	System.out.println("GirlMethodInterceptor->intercept开始......");
  	Object object = proxy.invokeSuper(obj, args);
  	System.out.println("GirlMethodInterceptor->intercept结束......");
  	return object;
  }
}

4.3 测试main方法

public class TestCglibProxyDemo {
  public static void main(String[] args){
  	Enhancer enhancer = new Enhancer();
  	enhancer.setSuperclass(GirlTopic.class);
  	enhancer.setCallback(new GirlMethodInterceptor());
  	GirlTopic girlTopic = (GirlTopic)enhancer.create();
  	girlTopic.getInfo("F");
  }
}

以上,感谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值