💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## 动态代理的细节 接口 ~~~ public interface Person { public void run(); public void fly(); public String sleep(); public String eat(String name); } ~~~ 被装饰类 ~~~ public class NormalPerson implements Person { @Override public void run() { System.out.println("走"); } @Override public void fly() { System.out.println("飞"); } public String sleep() { return "abcd"; } @Override public String eat(String name) { System.out.println("吃" + name); return "吃饱了"; } } ~~~ 调用 ~~~ public static void main(String[] args) { final NormalPerson normalPerson = new NormalPerson(); //使用JDK提供的动态代理动态代理的方式增强 /** * 参数1:和要被增强的对象一样的类加载器 * 参数2:和要被增强的对象一样的接口 * 1.根据指定的传递接口返回一个该接口下的实例 * 2.传递的接口里面的方法就是可以被增强的所有方法,被增强类自己的方法无法被增强 * 参数3:所有的增强业务的实现(方法) */ Person proxyInstance = (Person) Proxy.newProxyInstance( normalPerson.getClass().getClassLoader(), normalPerson.getClass().getInterfaces(), //匿名内部类 new InvocationHandler() { //invoke里面就是所有的增强业务逻辑代码 /** * 参数1:不用管,永远是固定值,代理对象的类型 * 参数2:要被增强的方法 * 参数3:要被增强的方法运行过程中需要的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //让之前的方法执行 /** * 参数1:本身执行这个方法的对象 * 参数2:执行这个方法需要的参数 */ method.invoke(normalPerson, args); //写增强业务逻辑 System.out.println("走变飞"); //只针对某个方法进行增强 if ("eat".equals(method.getName())){ System.out.println("只调用eat的方法"); } //谁调用就返回给谁,需要被代理类的支持 return "1234"; //如果按照这样写返回值的内容就是"abcd" // return method.invoke(normalPerson,args); } } ); proxyInstance.run(); //执行这个方法invoke都会执行一遍,执行的内容就是针对该方法的增强. proxyInstance.fly(); //执行这个方法invoke都会执行一遍,执行的内容就是针对该方法的增强. String val1 = proxyInstance.sleep(); //这里得到的返回值是invoke中返回的返回值 System.out.println(val1); String val2 = proxyInstance.eat("榴莲"); System.out.println(val2); } ~~~