給定一個類,判斷它是使用JDK動態代理還是cglib代理,分別使用JDK動態代理或cglib代理去實現切面的功能。
阿新 • • 發佈:2021-02-06
第一步
建立一個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代理