java-动态代理
什么是动态代理?
就是无侵入式的给代码增加额外的功能。
程序为什么需要代理?代理长什么样?
如图:
中介如何知道要派有唱歌,跳舞方法的代理呢?
通过接口的方式去实现的
下面我们来创建一个简单的对象:
package dongtaidaili.proxy;public class BigStar implements Star{private String name;public BigStar() {}public BigStar(String name) {this.name = name;}// 唱歌public String sing(String name) {System.out.println(this.name + "正在唱歌..."+ name);return "谢谢";}// 跳舞public void dance() {System.out.println(this.name + "正在跳舞...");}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";} }
接口:
package dongtaidaili.proxy;public interface Star {// 我们可以吧所有想要被代理的方法定义在接口中public String sing(String name);// 唱歌public void dance(); // 跳舞 }
如何为java对象创建一个代理对象?
java.lang.reflect.Proxy类,提供了为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
---参数1:用于指定那个类加载器,去加载生成的代理类
---参数2:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
---参数3:用来指定生成的代理对象要干什么事情
package dongtaidaili.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;import static sun.net.www.protocol.http.AuthCacheValue.Type.Proxy;public class ProxyUtil {/*方法的作用:给一个明星的对象,创建一个代理形参:被代理的明星对象返回值:给明星创建的代理*/public static Star createProxy(BigStar bigStar) {
/*
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)---参数1:用于指定那个类加载器,去加载生成的代理类---参数2:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法---参数3:用来指定生成的代理对象要干什么事情*/Star star = (Star) java.lang.reflect.Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("sing")){System.out.println("唱歌代理");} else if (method.getName().equals("dance")){System.out.println("跳舞代理");}return method.invoke(bigStar,args);}});return star;}
}
总结:
1.为什么需要代理呢?
代理可以无侵入式的给对象增强其他的功能
2.代理长什么样?
代理里面就是对象被代理的方法
3.java通过上面来保证代理的样子?
通过接口保证,后米娜的对象和代理需要实现同一个接口,接口中就是被代理的所有方法。