java动态代理与cglib动态代理
public interface Subject {
String sayHelloWorld(String name,Subject subject);
Subject sayBye();
void haha();
}
public class RealSubject implements Subject{
private String stest;
public String getStest() {
return stest;
}
public void setStest(String stest) {
this.stest = stest;
}
@Override
@NotNull
public String sayHelloWorld(String name,Subject subject) {
return "hello"+name;
}
@Override
public Subject sayBye() {
RealSubject subject= new RealSubject();
subject.setStest("good job!");
System.out.println("good Job!");
return subject;
}
public void haha(){
System.out.println("测试************");
}
}
public class ProxyMain {
public static void main(String[] args) {
/**JDK动态代理:必须通过接口代理*/
Subject subject = (Subject) jdkProxy();
subject.sayBye();
/**Cglib 动态代理:*/
Subject subject1 = (Subject) cglibProxy();
subject1.sayBye();
}
/**
* JDK 动态代理:
* 创建被代理对象
* 获取被代理对象的接口类模版数组
* 实现InvocationHandler的invoke 方法,执行代理逻辑
* 通过Proxy.newProxyInstance 获取代理对象
*
* @return java.lang.Object
* @Returns
* @author 陈奎金
* @date: 2022/2/8 14:41
* @updateUser(修改人): user
* @updateDate(修改时间): 2022/2/8 14:41
* @updateRemark(修改备注): 说明本次修改内容
**/
public static Object jdkProxy() {
/**创建被代理对象*/
Subject subject = new RealSubject();
/**获取被代理对象的接口末班数组*/
Class[] interfaces = subject.getClass().getInterfaces();
return Proxy.newProxyInstance(subject.getClass().getClassLoader(), interfaces, (proxy, method, args) -> {
System.out.println("调用之前");
System.out.println(method.getName());
switch (method.getName()) {
case "SayHelloWorld":
return "" + method.invoke(subject, args);
case "sayBye":
Object object = method.invoke(subject, args);
return object;
case "haha":
return null;
default:
return new Object();
}
});
}
/**
* cglib. 动态代理
* 创建被代理对象
* 窗增强器->设置父类->设置回调-->回调对象虚实现MethodInterceptor接口中intercept 方法-->创建代理对象
*
* @return 代理对象
* @Returns
* @author 陈奎金
* @date: 2022/2/8 14:36
* @updateUser(修改人): user
* @updateDate(修改时间): 2022/2/8 14:36
* @updateRemark(修改备注): 说明本次修改内容
**/
public static Object cglibProxy() {
/**创建被代理对象*/
Subject subject = new RealSubject();
/**创建增强器,用来创建代理对象*/
Enhancer enhancer = new Enhancer();
/**设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类*/
enhancer.setSuperclass(subject.getClass());
/**创建代理逻辑*/
MethodInterceptor methodInterceptor = (proxy, method, obj, methodProxy) -> {
System.out.println("调用之前");
System.out.println("Method" + method);
switch (method.getName()) {
case "sayHelloWorld":
String string = (String) methodProxy.invoke(subject, obj);
return "" + string;
case "sayBye":
Object object = methodProxy.invoke(subject, obj);
return object;
case "haha":
return null;
default:
return new Object();
}
};
/**设置回调:将代理逻辑设置到回调中*/
enhancer.setCallback(methodInterceptor);
/**创建代理对象,并将代理对象返回*/
return enhancer.create();
}
}