代理类调用:
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"); } }