应用条件: jdk动态代理只能使用在可以提供接口的对象里,在一些不能提供接口的对象里,用cglib动态代理,它只需要提供一个非抽象类。
步骤
先用maven导入cglib
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
提供真实对象的类(要代理的类)PhoneImpl.java
public class PhoneImpl {
public void product5S() {
System.out.println("生产iPhone 5S中");
}
public void product6S() {
System.out.println("生产iPhone 6S中");
}
}
提供一个代理类CglibProxy.java
,实现接口net.sf.cglib.proxy.MethodInterceptor
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{
//生成代理对象,返回代理对象PhoneImpl
public Object getProxy(Class cls) {
//enhancer增强类对象
Enhancer enhancer=new Enhancer();
//设置增强类型
enhancer.setSuperclass(cls);
//定义代理逻辑对象为当前对象,要求当前对象实现MethodInterceptor方法
enhancer.setCallback(this);
//生成并返回代理对象
return enhancer.create();
}
/**
* 代理逻辑对象
* @param proxy 代理对象
* @param method 方法
* @param args 方法参数
* @param methodProxy 方法代理
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("调用 "+method.getName()+" 方法之前");
Object obj = methodProxy.invokeSuper(proxy, args);
System.out.println("调用 "+method.getName()+" 方法之后");
return obj;
}
}
测试类Test.java
public class Test {
public static void main(String[] args) {
CglibProxy cglib=new CglibProxy();
PhoneImpl proxy=(PhoneImpl)cglib.getProxy(PhoneImpl.class);
proxy.product5S();
System.out.println();
proxy.product6S();
}
}
运行结果
调用 product5S 方法之前
生产iPhone 5S中
调用 product5S 方法之后
调用 product6S 方法之前
生产iPhone 6S中
调用 product6S 方法之后