代理:是基本的设计模式之一,我们用插入的(代理者)来代替实际的对象(供应者),以此来为我们提供不同的操作和额外的方法,而代理就是两者之间的角色
静态代理:手动代理,没有去动态的创建代理对象。
package com.package14.Two;class RealObject implements Interface{//供应者@Overridepublic void doSomething() {System.out.println("RealObject doSomething()");}@Overridepublic void somethingElse(String arg) {System.out.println("somethingElse"+arg);}}class SimplePerxy implements Interface {//代理者private Interface anInterface;SimplePerxy(Interface anInterface){this.anInterface=anInterface;}@Overridepublic void doSomething() {info();System.out.println("SimplePerxy doSomething");//代理者自己的方法anInterface.doSomething();//拿到了供应者的方法}@Overridepublic void somethingElse(String arg) {info();System.out.println("SimplePerxy somethingElse"+arg);//代理者自己的方法anInterface.somethingElse(arg);//拿到了供应者的方法}public void info(){System.out.println("代理者额外的方法");}}public class SimplePerxyDemo {public static void consumer(Interface ainterface){ainterface.doSomething();ainterface.somethingElse("boolean");}public static void main(String[] args) {consumer(new RealObject());System.out.println("================");consumer(new SimplePerxy(new RealObject()));}}
上述的列子中,我们不仅通过代理让同一个方法表现了不同的操作。同时,代理者还提供了额外的方法
动态代理 :动态的创建代理对象,并动态的处理对代理方法的调用
package com.package14.Two;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;class ProxyMetthed implements InvocationHandler{//代理者Object object;ProxyMetthed(Object object){this.object=object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//该proxy对象 和Proxy.newProxyInstance产生的代理对象 是一个对象return method.invoke(object,args);}}interface SomeMethed{void test();}abstract class MethedDemo implements SomeMethed{@Overridepublic void test() {System.out.println("语言");}}class Chains extends MethedDemo{@Overridepublic void test() {System.out.println("中文");}}public class ProxyDemo {public static void main(String[] args) {info(new Chains());}static void info(Object object){SomeMethed someMethed=(SomeMethed)Proxy.newProxyInstance(SomeMethed.class.getClassLoader(),new Class[]{SomeMethed.class},new ProxyMetthed(object));someMethed.test();}}
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)去动态的创建代理。
方法参数使用:
1:loader:该接口的类加载器或实现该接口的类的加载器
2. interfaces:供应者的接口
获取方式
2-1,通过代理者的class对象动态获取 MethedDemo.class.getInterfaces()
注意:无法通过代理者获取接口,虽然继承供应者
System.out.println(Arrays.toString(Chains.class.getInterfaces()));
2-2,手动的方式去指定 new Class[]{SomeMethed.class}
3:h:是InvocationHandler的一个实例,供应者与代理者的中间角色(代理);
proxy:其实和Proxy.newProxyInstance产生的代理对象 是一个对象
method:执行的代理目标方法
args:目标方法的参数
返回的Object是目标方法的返回值
