一个接口代理demo

 

说明: 自定义一个接口,动态生成代理类并执行

核心代码为 java提供

Proxy

的api:

public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)

 

核心代码:

import com.ahd.feign.intef.UserInte;import java.lang.reflect.Proxy;public class ProxyTest {public static void main(String[] args) {
        System.out.println(UserInte.class.isInterface());//isInterface 判断是否是接口,UserInte即自定义的接口Object o = Proxy.newProxyInstance(UserInte.class.getClassLoader()//自定义接口 UserInte 的类加载器, new Class[]{UserInte.class}//自定义接口的class对象, new MyInvocationHandler());//自定义的实现 InvocationHandler的调用处理类        
        UserInte userInte = (UserInte)o;
        
        userInte.test(); //自定义接口用来测试的方法    }
}

 

自定义接口 UserInte 代码(被代理的接口):

public interface UserInte {public void test();

}

 

自定义InvocationHandler类,重写 invoke方法
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {
    @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = null;//如果传进来的是一个接口(核心)if (method.getDeclaringClass().isInterface()) {try {//可以做一系列代理操作//如调用方法//如远程http操作//这里测试只打印一句话System.out.println("接口调用成功");
            } catch (Throwable t) {
                t.printStackTrace();
            }//如果传进来是类} else {try {
                invoke = method.invoke(this, args);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }return invoke;
    }
}

 

效果:

一个接口代理demo_demo