1 动态代理技术
JDK条件:目标类有接口,是基于接口动态生成实现类的代理对象。
Cglib条件:目标类无接口且不能用final修饰,基于被代理对象动态生成子类代理对象
实现类
package proxy;
public class User {
public void methodPublic1() {
System.out.println("methodPublic1");
}
public void methodPublic2(String a) {
System.out.println(a+"========methodPublic2");
}
public void defaultMethod1(int b) {
System.out.println(b+"========defaultMethod1");
}
public void defaultMethod2() {
System.out.println("defaultMethod2");
}
}
拦截类
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class UserMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] arg,
MethodProxy proxy) throws Throwable {
System.out.println("before:"+method.getName());
Object object = proxy.invokeSuper(obj, arg);
System.out.println("after:"+method.getName());
return object;
}
}
测试类
public class Testcglib {
public static void main(String[] args) {
//该设置用于输出cglib动态代理产生的类
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\cglibProxyClass");
Enhancer enhancer = new Enhancer();
//继承被代理类
enhancer.setSuperclass(User.class);
//设置回调
enhancer.setCallback(new UserMethodInterceptor());
//生成代理类对象
User user = (User)enhancer.create();
//在调用代理类中方法时会被我们实现的方法拦截器进行拦截
user.methodPublic1();
user.methodPublic2("22222222");
user.defaultMethod1(111);
user.defaultMethod2();
}
}