代理:是基本的设计模式之一,我们用插入的(代理者)来代替实际的对象(供应者),以此来为我们提供不同的操作和额外的方法,而代理就是两者之间的角色
    静态代理:手动代理,没有去动态的创建代理对象。

    1. package com.package14.Two;
    2. class RealObject implements Interface{//供应者
    3. @Override
    4. public void doSomething() {
    5. System.out.println("RealObject doSomething()");
    6. }
    7. @Override
    8. public void somethingElse(String arg) {
    9. System.out.println("somethingElse"+arg);
    10. }
    11. }
    12. class SimplePerxy implements Interface {//代理者
    13. private Interface anInterface;
    14. SimplePerxy(Interface anInterface){
    15. this.anInterface=anInterface;
    16. }
    17. @Override
    18. public void doSomething() {
    19. info();
    20. System.out.println("SimplePerxy doSomething");//代理者自己的方法
    21. anInterface.doSomething();//拿到了供应者的方法
    22. }
    23. @Override
    24. public void somethingElse(String arg) {
    25. info();
    26. System.out.println("SimplePerxy somethingElse"+arg);//代理者自己的方法
    27. anInterface.somethingElse(arg);//拿到了供应者的方法
    28. }
    29. public void info(){
    30. System.out.println("代理者额外的方法");
    31. }
    32. }
    33. public class SimplePerxyDemo {
    34. public static void consumer(Interface ainterface){
    35. ainterface.doSomething();
    36. ainterface.somethingElse("boolean");
    37. }
    38. public static void main(String[] args) {
    39. consumer(new RealObject());
    40. System.out.println("================");
    41. consumer(new SimplePerxy(new RealObject()));
    42. }
    43. }

    上述的列子中,我们不仅通过代理让同一个方法表现了不同的操作。同时,代理者还提供了额外的方法
    动态代理 :动态的创建代理对象,并动态的处理对代理方法的调用

    1. package com.package14.Two;
    2. import java.lang.reflect.InvocationHandler;
    3. import java.lang.reflect.Method;
    4. import java.lang.reflect.Proxy;
    5. class ProxyMetthed implements InvocationHandler{
    6. //代理者
    7. Object object;
    8. ProxyMetthed(Object object){this.object=object;}
    9. @Override
    10. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    11. //该proxy对象 和Proxy.newProxyInstance产生的代理对象 是一个对象
    12. return method.invoke(object,args);
    13. }
    14. }
    15. interface SomeMethed{
    16. void test();
    17. }
    18. abstract class MethedDemo implements SomeMethed{
    19. @Override
    20. public void test() {
    21. System.out.println("语言");
    22. }
    23. }
    24. class Chains extends MethedDemo{
    25. @Override
    26. public void test() {
    27. System.out.println("中文");
    28. }
    29. }
    30. public class ProxyDemo {
    31. public static void main(String[] args) {
    32. info(new Chains());
    33. }
    34. static void info(Object object){
    35. SomeMethed someMethed=
    36. (SomeMethed)Proxy.newProxyInstance(SomeMethed.class.getClassLoader(),new Class[]{SomeMethed.class},new ProxyMetthed(object));
    37. someMethed.test();
    38. }
    39. }

    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是目标方法的返回值