动态代理:创建、工作流程演示
package Karl.Demo.DaiLi; public class Test { public static void main(String[] args) { BigStar s=new BigStar("杨超越"); Star star=ProxyUtil.createProxy(s); String rs=star.sing("好日子"); System.out.println(rs); } }
package Karl.Demo.DaiLi; public interface Star { String sing(String name); void dane(); }
package Karl.Demo.DaiLi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyUtil { //设置createProxy方法 //返回值为Star public static Star createProxy(BigStar bigStar){ /* public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 参数1:用于指定一个类加载器 参数2:指定生成的代理长什么样子,也就是有哪些方法 参数3:用来指定生成的代理对象要干什么事情*/ Star starProxy=(Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class},new InvocationHandler(){ @Override//回调方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //代理对象要做的事情,会在这里写代码 if (method.getName().equals("sing")){ System.out.println("准备话筒,收钱20万"); }else if (method.getName().equals("dance")){ System.out.println("准备场地,收钱1000万"); } //返回给上面的bigStar参数 return method.invoke(bigStar,args); } }); //返回给上面的starProxy方法 return starProxy; } }
package Karl.Demo.DaiLi; public class BigStar implements Star{ //设置成员变量name private String name; //把传入的name赋值给本类成员变量name public BigStar(String name){ this.name=name; } //重写接口方法 @Override //设置方法传入name public String sing(String name) { //获取本类name获取传入的name System.out.println(this.name+"正在唱:"+name); //返回值 return "谢谢大家!"; } @Override //因为跳舞没有名字所以没有传入name //void表示没有返回值 public void dane() { System.out.println(this.name+"正在优雅的跳舞"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现