package com.mangoubiubiu.show.a13;
import java.lang.reflect.Method;
public class A13 {
    interface Foo{
        void foo()  ;
        int bar()  ;
    }
    interface InvocationHandler{
        Object invoke(Object proxy,Method method,Object[] args ) throws  Throwable;
    }
    static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }
        @Override
        public int bar() {
            System.out.println("target bar");
            return 100;
        }
    }
    public static void main(String [] param) throws Throwable {
        Foo proxy = new $Proxy0((Object p,Method method,Object[] args ) -> {
            System.out.println("before");
          return   method.invoke(new Target(),args);
        });
        proxy.foo();
        proxy.bar();
    }
}
 
package com.mangoubiubiu.show.a13;
import java.lang.reflect.Method;
public class A13 {
    interface Foo{
        void foo()  ;
        int bar()  ;
    }
    interface InvocationHandler{
        Object invoke(Object proxy,Method method,Object[] args ) throws  Throwable;
    }
    static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }
        @Override
        public int bar() {
            System.out.println("target bar");
            return 100;
        }
    }
    public static void main(String [] param) throws Throwable {
        Foo proxy = new $Proxy0((Object p,Method method,Object[] args ) -> {
            System.out.println("before");
          return   method.invoke(new Target(),args);
        });
        proxy.foo();
        int bar = proxy.bar();
        System.out.println("目标对象的返回结果是"+bar);
    }
}
 
二、使用jdk自带的InvocationHandler
package com.mangoubiubiu.show.a13;
import java.lang.reflect.Method;
public class A13 {
    interface Foo{
        void foo()  ;
        int bar()  ;
    }
//    interface InvocationHandler{
//        Object invoke(Object proxy,Method method,Object[] args ) throws  Throwable;
//    }
    static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }
        @Override
        public int bar() {
            System.out.println("target bar");
            return 100;
        }
    }
    public static void main(String [] param) throws Throwable {
        Foo proxy = new $Proxy0((Object p,Method method,Object[] args ) -> {
            System.out.println("before");
          return   method.invoke(new Target(),args);
        });
        proxy.foo();
        int bar = proxy.bar();
        System.out.println("目标对象的返回结果是"+bar);
    }
}
 
package com.mangoubiubiu.show.a13;
import com.mangoubiubiu.show.a13.A13.Foo;
import com.mangoubiubiu.show.a13.A13.Target;
//import com.mangoubiubiu.show.a13.A13.InvocationHandler;
import org.springframework.cglib.proxy.UndeclaredThrowableException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class $Proxy0 extends Proxy implements Foo {
    public $Proxy0(InvocationHandler h){
      super(h);
     }
    @Override
    public void foo()  {
        try {
            h.invoke(this,foo,new Object[0]);
        } catch (RuntimeException | Error e) {
            throw e;
        } catch (Throwable e){
            throw new UndeclaredThrowableException(e);
        }
    }
    @Override
    public int bar()  {
        try {
            Object result = h.invoke(this,bar, new Object[0]);
            return (int) result;
        } catch (RuntimeException | Error e) {
            throw e;
        } catch (Throwable e){
            throw new UndeclaredThrowableException(e);
        }
    }
    static Method foo;
    static Method bar;
    static {
        try {
            foo = Foo.class.getMethod("foo");
            bar = Foo.class.getMethod("bar");
        } catch (NoSuchMethodException e) {
            throw new NoSuchMethodError(e.getMessage());
        }
    }
}
 
