cglib 代理

JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。

 Cglib动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

简单实例:

 

要添加代理的类:ProxyImpl

package reflrction.proxy.staticState;

import reflrction.proxy.ITestProxy;

public class ProxyImpl implements ITestProxy {

 @Override
 public void test001() {
  System.out.println("ProxyImpl test001>>>>>>>>>>>>>>>>>>>>>>>>>>");
  
 }

 @Override
 public void test002() {
  System.out.println("ProxyImpl test002>>>>>>>>>>>>>>>>>>>>>>>>>>");
  
 }

}

cglib代理:CglibProxy

package reflrction.proxy.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 target;

 /**
  * 创建代理对象
  *
  * @param target
  * @return
  */
 public Object getInstance(Object target) {
  this.target = target;
  Enhancer enhancer = new Enhancer();
  enhancer.setSuperclass(this.target.getClass());
  // 回调方法
  enhancer.setCallback(this);
  // 创建代理对象
  return enhancer.create();
 }

 @Override
 // 回调方法
 public Object intercept(Object obj, Method method, Object[] args,
   MethodProxy proxy) throws Throwable {
  System.out.println("cglib代理开始");
  proxy.invokeSuper(obj, args);
  System.out.println("事cglib代理结束");
  return null;
 }
}

主函数:CglibMain

package reflrction.proxy.cglib;

import reflrction.proxy.staticState.ProxyImpl;

public class CglibMain {

 /**
  * @param args
  */
 public static void main(String[] args) {
  CglibProxy cglibProxy = new CglibProxy();
  ProxyImpl proxyImpl = (ProxyImpl) cglibProxy.getInstance(new ProxyImpl());
  proxyImpl.test001();
  proxyImpl.test002();
  System.out.println(proxyImpl.getClass().getName());
 }

}

执行结果:

cglib代理开始
ProxyImpl test001>>>>>>>>>>>>>>>>>>>>>>>>>>
事cglib代理结束
cglib代理开始
ProxyImpl test002>>>>>>>>>>>>>>>>>>>>>>>>>>
事cglib代理结束
reflrction.proxy.staticState.ProxyImpl$$EnhancerByCGLIB$$763ce1c8

基本原理解析:

1.JDK的动态代理要求,有做代理的类必须实现一个接口,cglib不需要:

2.cglib使用了一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类:

3.原理都是生成原类的子类,对子类的方法重写:

 

 

 

 

 

 

 

你可能感兴趣的:(java 代理)