一个接口代理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; } }
效果: