cglib动态代理,是采用继承的方式实现动态代理的,代理类是目标类的子类,所以无法代理final修饰的类
ps:需要引入cglib的jar包(cglib-nodep-2.2.2.jar )
示例代码如下:
被代理类:
package cglibproxy;
public class Train
{
public void move()
{
System.out.println("火车开动了。。。");
}
}
package cglibproxy;
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 Enhancer enhancer = new Enhancer();
public Object getProxy(Class<?> cls)
{
/*
* 设置代理类的父类
* ps:cglib是采用继承的方法实现动态代理的,
* 代理类是目标类的子类,
* 所以我们需要将目标类设置为父类
*/
enhancer.setSuperclass(cls);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 拦截目标类所有方法的调用
* @param obj 目标类的实例
* @param method 目标方法的反射对象
* @param args 目标方法的参数
* @param proxy 代理类的实例
*/
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable
{
System.out.println("检查是否符合启动条件!");
/*
* 代理类调用父类的方法
* ps:cglib是采用继承的方法实现动态代理的,
* 代理类是目标类的子类,
* 所以我们需要调用父类的方法
*/
return proxy.invokeSuper(obj, args);
}
}
package cglibproxy;
public class TestCglib
{
public static void main(String[] args)
{
CGlibProxy proxy = new CGlibProxy();
Train t = (Train) proxy.getProxy(Train.class);
t.move();
}
}