Java动态代理
一、概述
二、具体实现
2,1创建被代理对象(同时里面包含了相关的方法)
packagecom.itheima.mydynamicproxy1.zj;publicclassBigStarimplementsStar{// 先是创建一个类privateStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicBigStar(Stringname){this.name=name;}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方法。