第一步
创建一个user接口
public interface User {
public void say();
}
创建一个A类,继承User接口
public class A implements User {
@Override
public void say() {
System.out.println("AAAAAAAAAA");
}
}
第二步
分别创建Cglib代理类和Jdk动态代理类
@AllArgsConstructor
public class JdkProx implements InvocationHandler {
public Object o;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JdkProx在什么之前");
Object result = method.invoke(this.o, args);
System.out.println("jdkProx在什么之后");
return result;
}
}
public class CglibProx implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib在什么之前");
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("cglib在什么之后");
return o1;
}
}
第三步,测试
public class Test {
public static void main(String[] args) {
Class<A> aClass = A.class;
Class<?>[] interfaces = aClass.getInterfaces();
if (interfaces.length == 0) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(A.class);
enhancer.setCallback(new CglibProx());
A a = (A) enhancer.create();
a.say();
}else {
JdkProx jdkProx = new JdkProx(new A());
User user = (User) Proxy.newProxyInstance(aClass.getClassLoader(), interfaces, jdkProx);
user.say();
}
}
}
运行结果
判断是Jdk动态代理还是Cglib代理主要是看是否继承了接口,如果有接口则是Jdk动态代理,没有接口则是cglib代理