Java动态代理

📅 发布时间:2026/7/10 15:56:17 👁️ 浏览次数:
Java动态代理
Java动态代理一、概述二、具体实现2,1创建被代理对象同时里面包含了相关的方法packagecom.itheima.mydynamicproxy1.zj;publicclassBigStarimplementsStar{// 先是创建一个类privateStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicBigStar(Stringname){this.namename;}publicBigStar(){}// 然后是有唱歌和跳舞的方法OverridepublicStringsing(Stringname){System.out.println(this.name正在唱name);return谢谢;}Overridepublicvoiddance(){System.out.println(this.name正在跳舞);}}2.2创建接口里面是用来定义要代理的方法packagecom.itheima.mydynamicproxy1.zj;publicinterfaceStar{publicabstractStringsing(Stringname);publicabstractvoiddance();}2.2创建用于生成代理对象的类重点packagecom.itheima.mydynamicproxy1.zj;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassProxyUtill{// 下面静态方法的作用是给一个对象创建代理对象// 其中方法传递的形象就是需要代理的对象// 首先是创建静态方法publicstaticStarcreateProxy(BigStarbigStar){// 下面这是源码// public static Object newProxyInstance(ClassLoader loader, Class?[] interfaces, InvocationHandler h)// 其中第一个参数是类加载器用于加载代理类// 第二个参数是用来指定代理类长成什么样相当于是传递过来的属性// 第三个参数就是指定代理类干什么也就是执行哪些方法// 那么下面就是逐一进行// 获取类加载器// 这句代码实际上做了两件事1,.获取先找到是谁将当前类加载到内存。2.再次使用这个类加载器来加载我们的代理Starstar(Star)Proxy.newProxyInstance(// 这就是上面的参数一ProxyUtill.class.getClassLoader(),// 类加载器干什么实际上是封装在接口当中的newClass[]{Star.class},newInvocationHandler(){OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{// 下面就是在判断这个类了if(sing.equals(method.getName())){// 下面就是代理做的一些准备工作System.out.println(准备话筒收钱);}elseif(dance.equals(method.getName())){System.out.println(准备场地收钱);}// 去找大明星唱歌或者跳舞// 指定是哪个明星进行什么动作returnmethod.invoke(bigStar,args);}});//返回代理好的对象即可returnstar;}}这里面其实分清楚层次再加上看看源码其实并不难理解首先整体上是通过createProxy这个静态方法来生成代理对象需要传递被代理对象作为形参其底层又是运用Proxy的newProxyInstance方法。