import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author jie
* @date 2019/9/10 21:24
* 动态代理概述
* 1.代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象。
* 举例:春节回家买票让人代买
* <p>
* 2.在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口
* 3.通过使用这个类和接口就可以生成动态代理对象。
* <p>
* 4.JDK提供的代理只能针对接口做代理。
* <p>
* 5.我们有更强大的代理cglib
* 6.Proxy类中的方法创建动态代理类对象
* Proxy 通过 newProxyInstance(loader,interfaces,h)创建代理对象
* InvocationHandler的invoke(proxy,method, args)方法会拦截方法的调用
*/
public class ProxyTest {
public static void main(String[] args) {
// 1.创建对象
UserServiceImpl service = new UserServiceImpl();
// 2.创建代理对象
UserService proxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("method = " + method);
System.out.println("事务开始...");
// 方法返回值 拦截方法
Object returnObj = method.invoke(service, args);
System.out.println("事务结束...");
return returnObj;
}
});
proxy.registerUser();
System.out.println("proxy.deleteUser() = " + proxy.deleteUser());
// 会拦截toString()方法
// System.out.println("proxy = " + proxy);
}
}
interface UserService {
void registerUser();
int deleteUser();
}
class UserServiceImpl implements UserService {
@Override
public void registerUser() {
//System.out.println("权限校验...");
System.out.println("注册一个用户");
//System.out.println("日志记录...");
}
@Override
public int deleteUser() {
//System.out.println("权限校验...");
System.out.println("删除一个用户");
//System.out.println("日志记录...");
return 6;
}
}
代理模式
最新推荐文章于 2024-07-05 23:58:56 发布