jdk的动态代理

发布时间 2023-03-24 21:05:19作者: 陈嘻嘻-

jdk动态代理:(jdk动态代理,必须有接口)

1-Calculator接口内容:

public interface Calculator {
    int add(int i, int j);

    int sub(int i, int j);

    int mul(int i, int j);

    int div(int i, int j);
}

2-生产 "代理" 的工厂类

public class ProxyFactory {
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {
/**
 * newProxyInstance():创建一个代理实例 * 其中有三个参数:
 * 1、classLoader:加载动态生成的代理类的类加载器
 * 2、interfaces:目标对象实现的所有接口的class对象所组成的数组
 * 3、invocationHandler:设置代理对象实现目标对象方法的过程,即代理类中如何重写接 口中的抽象方法
 */
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /**
                 * proxy:代理对象
                 * * method:代理对象需要实现的方法,即其中需要重写的方法
                 * * args:method所对应方法的参数
                 */
                Object result = null;
                try {
                    System.out.println("[动态代理][日志] " + method.getName() + ",参 数:" + Arrays.toString(args));
                    result = method.invoke(target, args);
                    System.out.println("[动态代理][日志] " + method.getName() + ",结 果:" + result);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("[动态代理][日志] " + method.getName() + ",异 常:" + e.getMessage());
                } finally {
                    System.out.println("[动态代理][日志] " + method.getName() + ",方法 执行完毕");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}

3-Test:

 @Test
    public void testProxyFactory() {
        ProxyFactory factory = new ProxyFactory(new CalculatorPureImpl());
        Calculator c = (Calculator) factory.getProxy(); //这个是Calculator接口
        c.add(1,1);
        //c.div(1,0);
    }