动态代理
public interface UserManager {
void addUser(String username);
void delUser(String username);
}
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username) {
System.out.println("add user " + username);
}
@Override
public void delUser(String username) {
System.out.println("delete user " + username);
}
}
JDK动态代理
package wang.proxy.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler {
// 用于指向被代理对象
private Object targetObject;
public Object newProxy(Object targetObject) {
// 将被代理对象传入进行代理
this.targetObject = targetObject;
// 返回代理对象
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
}
/**
* 被代理对象的任何方法执行时,都会被invoke方法替换,即:代理对象执行被代理对象中的任何方法时,实际上执行的时当前的invoke方法
*
* @param proxy(代理对象的引用)
* @param method(当前执行的方法)
* @param args(当前执行方法所需的参数)
* @throws Throwable
* @return(和被代理对象方法有相同的返回值)
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在原来的方法上增加了日志打印功能,增强代码
printLog(method.getName());
return method.invoke(targetObject, args);
}
/**
* 模拟日志打印
*/
private void printLog(String methodName) {
System.out.println("日志打印: " + methodName);
}
}
测试:
public class JDKMain {
public static void main(String[] args) {
UserManager userManager = new UserManagerImpl();
System.out.println("--------------------没有使用增强过的方法--------------------");
userManager.addUser("root");
userManager.delUser("root");
System.out.println("--------------------使用代理对象增强过的方法--------------------");
JDKProxy jdkProxy = new JDKProxy();
UserManager userManagerProxy = (UserManager)jdkProxy.newProxy(userManager);
userManagerProxy.addUser("scott");
userManagerProxy.delUser("scott");
}
}
--------------------没有使用增强过的方法--------------------
add user root
delete user root
--------------------使用代理对象增强过的方法--------------------
日志打印: addUser
add user scott
日志打印: delUser
delete user scott
CGLIB动态代理
public class CGLibProxy implements MethodInterceptor {
// 用于指向被代理对象
private Object targetObject;
// 用于创建代理对象
public Object createProxy(Object targetObject) {
this.targetObject = targetObject;
return new Enhancer().create(this.targetObject.getClass(), this);
}
/**
* @param proxy(代理对象的引用)
* @param method(当前执行的方法)
* @param args(当前执行方法所需的参数)
* @param methodProxy(当前执行方法的代理对象)
* @throws Throwable
* @return(和被代理对象方法有相同的返回值)
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
String methodName = method.getName();
if ("addUser".equals(methodName)) {
printLog(methodName);
}
System.out.println("xx:" + methodProxy.getSuperName());
return methodProxy.invokeSuper(proxy, args);
}
/**
* 模拟日志打印
*/
/**
* 模拟日志打印
*/
private void printLog(String methodName) {
System.out.println("日志打印: " + methodName);
}
}
测试
public class CGLIBMain {
public static void main(String[] args) {
UserManager userManager = new UserManagerImpl();
System.out.println("--------------------没有使用增强过的方法--------------------");
userManager.addUser("root");
userManager.delUser("root");
System.out.println("--------------------使用代理对象增强过的方法--------------------");
CGLibProxy cgLibProxy = new CGLibProxy();
UserManager cgLibProxyProxy = (UserManager)cgLibProxy.createProxy(userManager);
cgLibProxyProxy.addUser("scott");
cgLibProxyProxy.delUser("scott");
}
}
--------------------没有使用增强过的方法--------------------
add user root
delete user root
--------------------使用代理对象增强过的方法--------------------
日志打印: addUser
xx:CGLIB$addUser$0
add user scott
xx:CGLIB$delUser$1
delete user scott
标签:spring,Object,代理,--------------------,user,动态,public,targetObject
From: https://www.cnblogs.com/shmilyt/p/17114775.html