一个接口代理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 {
    @Override
    public 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;
    }
}

 

效果:

 

posted @ 2021-03-13 19:09  爱华顿g  阅读(88)  评论(0编辑  收藏  举报