代理:
简单理解就可以理解为在一个java类上去给它增加一些新的功能,但是却不用动原来
的代码,就是让代理角色帮助真实角色完成一件事情;
静态代理:
静态代理相当于是多写了一个代理类,在调用的时候调用的是代理类,在代理类中的
处理还是原生的处理逻辑,不过在前后添加上需要添加的代码。
缺点:需要为每一个被代理的对象都创建一个代理类。
public class StaticProxyDemo {
public static void main(String[] args) {
you you = new you();
you.mary();
System.out.println("----------");
company company = new company(you);
company.mary();
}
}
interface Mary{
void mary();
}
class you implements Mary{
@Override
public void mary() {
System.out.println("每个人都要结婚");
}
}
//婚庆公司代理角色
class company implements Mary{
private Mary mary;
public company(Mary mary) {
this.mary = mary;
}
@Override
public void mary() {
//代理角色帮助真实角色完成结婚这件事情
System.out.println("婚庆公司结婚之前帮忙布置婚礼");
mary.mary();
System.out.println("婚庆公司结婚之后收取尾款");
}
}
jdk动态代理:
通过下面这个方法创建动态的代理类,我们只需将别的类去调用我们实现的公共方法,就可以。
缺点:必须要实现接口。
public static Object newProxyInstance(ClassLoader loader,
参数1:实现的接口的类加载器
Class<?>[] interfaces,
参数2:基于接口的字节码文件对象数组
InvocationHandler h)
参数3:是接口InvocationHandler :代理的处理程序
throws IllegalArgumentException
参数3是一个接口:自定义一个类实现这个接口
重写这个接口中的invoke方法
Object invoke(Object proxy,Method method,Object[] args)throws Throwable
版本1
接口
public interface User {
//加
void add();
//减
void sub();
//乘
void mu();
//除
void divide();
}
}
实现类1
public class UserDemo01 implements User{
@Override
public void add() {
System.out.println("加法功能");
}
@Override
public void sub() {
System.out.println("减法功能");
}
@Override
public void mu() {
System.out.println("乘法功能");
}
@Override
public void divide() {
System.out.println("除法功能");
}
}
测试类
public class JdkProxyDemo {
public static void main(String[] args) {
User user = new UserDemo01();
user.add();
user.sub();
user.mu();
user.divide();
}
}
结果:
加法功能
减法功能
乘法功能
除法功能
版本2(改进后)
实现类2
public class UserDemo02 implements User {
@Override
public void add() {
System.out.println("权限校验") ;
System.out.println("执行加法功能");
System.out.println("产生日志文件");
}
@Override
public void sub() {
System.out.println("权限校验") ;
System.out.println("执行减法功能");
System.out.println("产生日志文件");
}
@Override
public void mu() {
System.out.println("权限校验") ;
System.out.println("执行乘法功能");
System.out.println("产生日志文件");
}
@Override
public void divide() {
System.out.println("权限校验") ;
System.out.println("执行除法功能");
System.out.println("产生日志文件");
}
}
测试类2
public class JdkProxyDemo {
public static void main(String[] args) {
User user2 = new UserDemo02();
user2.add();
user2.sub();
user2.mu();
user2.divide();
}
}
结果:
权限校验
执行加法功能
产生日志文件
权限校验
执行减法功能
产生日志文件
权限校验
执行乘法功能
产生日志文件
权限校验
执行除法功能
产生日志文件
版本3(加上jdk动态代理)
invocation的实现类
public class MyInvocation implements InvocationHandler {
private Object obj;
public MyInvocation(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("校验权限");
Object object = method.invoke(obj, args);
System.out.println("产生日志文件");
return object;
}
}
测试类3
public class JdkProxyDemo {
public static void main(String[] args) {
MyInvocation myInvocation = new MyInvocation(user);
User user1=(User) Proxy.newProxyInstance(
user.getClass().getClassLoader(),
user.getClass().getInterfaces(),
myInvocation
);
user1.add();
user1.sub();
user1.mu();
user1.divide();
}
}
结果:
校验权限
加法功能
产生日志文件
校验权限
减法功能
产生日志文件
校验权限
乘法功能
产生日志文件
校验权限
除法功能
产生日志文件