Proxy说明

代理类调用:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
Proxy与C#中用途有点接近的是委托:都可以给一个方法,实现方法的入常,返回值的修改

* Proxy代理需要: * 1.有一个接口类。 * 2.有一个实现类。 * 3.需要修改实现类功能,但又不想修改实现类。 * * 实现步骤: * 1.创建代理类 方法:Proxy.newProxyInstance * 参数 实现类实例类加载器、实现类接口加载器、实现类方向修改接口实现new InvocationHandler * 2.重写InvocationHandler接口的invoke方法,方法三个参数 proxy:代理对象、method:调用的方法、args:调用方法参数 * 3.有上面参数,在invoke中,我们就可以通过反射来执行给定的方法。 * * 这样我们就可以实现:修改入参、返回值的目的 * */ public class ProxyTest { public static void main(String[] args) { StudentE stu=new StudentE(); /* 三个参数: 1. 类加载器:真实对象.getClass().getClassLoader() 2. 接口数组:真实对象.getClass().getInterfaces() 3. 处理器:new InvocationHandler() */ Student stuProxy = (Student)Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), new InvocationHandler() { /* 代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行 参数: 1. proxy:代理对象 2. method:代理对象调用的方法,被封装为的对象 3. args:代理对象调用的方法时,传递的实际参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("study".equals(method.getName())) { double d=((double)args[0])*0.9; String res = (String)method.invoke(stu,d )+",代理抽层了"; System.out.println("车接车送"); return res; } return method.invoke(stu,args); } }); String study = stuProxy.study(1000); System.out.println(study); stuProxy.show(); } }

接口:

public interface Student {
    String study(double d);
    void show();
}

实现类:

public class StudentE implements Student {
    @Override
    public String study(double d) {
        System.out.println("学生学习交学费:"+d);
        return "学生学习交学费:"+d;
    }

    @Override
    public void show() {
        System.out.println("show");
    }
}

 

posted @ 2020-10-23 10:47  zhuyapeng  阅读(164)  评论(0编辑  收藏  举报