
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Student stu = new Student(); stu.eat("蛋糕"); stu.study(); //如何在不改变Student类中任何代码的前提下,通过study()方法输出一句话:我在认真的学习中。。。 //实现方式:使用动态代理 /* 动态代理: 参数详解:ClassLoader loader :类加载器,和被代理对象使用相同的加载器(被代理对象的类加载器) Class<?>[] interfaces : 接口类型的class数组,和被代理对象使用相同的接口(被代理对象实现的接口) InvocationHandler : 代理规则,完成代理增强的功能 */ //代理对象StudentIntafce 被代理对象:Student StudentIntafce stuIntafce = (StudentIntafce) Proxy.newProxyInstance(stu.getClass().getClassLoader(), new Class[]{StudentIntafce.class}, new InvocationHandler() { //执行Student类中方法都会经过invoke方法 //对method进行判断,如果是study,就进行增强,如果是其他方法,调用stu对象原有的功能即可 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("study".equals(method.getName())) { System.out.println("我在认真的学习中。。。"); return null; } else { return method.invoke(stu, args); } } }); stuIntafce.eat("烧烤"); stuIntafce.study(); } }
public class Student implements StudentIntafce{ public void eat(String food) { System.out.println("吃" + food); } public void study(){ System.out.println("在学习中。。。"); } }
public interface StudentIntafce { void eat(String food); void study(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)