package indi.exer.yuluo.jdk;
import indi.exer.yuluo.proxy.User;
import indi.exer.yuluo.proxy.UserService;
import indi.exer.yuluo.proxy.UserServiceImpl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestJDKProxy {
public static void main(String[] args) throws Exception {
// 创建原始对象
final UserService userService = new UserServiceImpl();
// jdk创建动态代理
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 额外功能的添加
System.out.println("--------proxy log---------");
// 原始方法运行
Object ret = (Object) method.invoke(userService, args);
return ret;
}
};
UserService userServiceProxy = (UserService) Proxy.newProxyInstance(TestJDKProxy.class.
getClassLoader(), userService.getClass().getInterfaces(), handler);
userServiceProxy.login("suns", "123456");
userServiceProxy.register(new User());
}
}
CGlib的动态代理
CGlib创建动态代理的原理:父子继承关系创建代理对象,原始类作为父类,代理类作为子类,这样既可以保证2者方法一致,同时在代理类中提供新的实现(额外功能+原始方法)
package indi.exer.yuluo.CGlib;
import indi.exer.yuluo.proxy.User;
public class UserService {
public void login(String name, String passwd) {
System.out.println(" test UserService.login");
}
public void register(User user) {
System.out.println("test UserService.register");
}
}
package indi.exer.yuluo.CGlib;
import indi.exer.yuluo.proxy.User;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class TestCGlib {
public static void main(String[] args) {
// 1 创建原始对象
final UserService userService = new UserService();
Enhancer enhancer = new Enhancer();
// 借用类加载器
enhancer.setClassLoader(TestCGlib.class.getClassLoader());
// 指定父类
enhancer.setSuperclass(userService.getClass());
MethodInterceptor interceptor = new MethodInterceptor() {
// 内部类实现intercept方法
// 等同于 InvocationHandler --> invoke
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 额外功能的添加
System.out.println("------cglib log-------");
Object ret = method.invoke(userService, args);
return ret;
}
};
enhancer.setCallback(interceptor);
UserService userServiceProxy = (UserService) enhancer.create();
userServiceProxy.login("yuluo", "123456");
userServiceProxy.register(new User());
}
}



