Spring笔记(01) 动态代理与反射

动态代理与反射。动态代理,增强方法。

1、计算接口 Cal

public interface Cal {

    public int add(int num1, int num2);

    public int sub(int num1, int num2);

    public int mul(int num1, int num2);

    public int div(int num1, int num2);

}

2、对应实现类

public class CalIml implements Cal {

    @Override
    public int add(int num1, int num2) {
        int result = num1+num2;
        return result;
    }

    @Override
    public int sub(int num1, int num2) {
        int result = num1 - num2;
        return result;
    }

    @Override
    public int mul(int num1, int num2) {
        int result = num1 * num2;
        return result;
    }

    @Override
    public int div(int num1, int num2) {
        int result = num1 / num2;
        return result;
    }

}

3、创建 MyInvocationHandler 类,并实现 InvocationHandler 接口,成为一个动态代理类。

public class MyInvocationHandler implements InvocationHandler {

    //委托对象
    private Object object;

    /**
     * 返回代理对象
     * @param o
     * @return
     */
    public Object bind(Object o){
        //需要传入委托对象,下面需要用到
        this.object = o;
        //jvm 运行时类 对象 类加载器 
        return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method 指委托对象中所有方法,args指方法对应的入参
        System.out.println(method.getName() + " 的参数是 " + Arrays.toString(args));
        if(method.getName().endsWith("add")){
            System.out.println("这是 Add 方法,需要特别打印");
        }
        Object result = method.invoke(object, args);
        System.out.println(method.getName() + " 的结果是 " + result);
        return result;
    }
}

4、测试

  public static void main( String[] args ) {
        Cal cal = new CalIml();
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
        Cal calProxy = (Cal) myInvocationHandler.bind(cal);
        calProxy.add(10, 3);
        calProxy.sub(10, 3);
    }
怎么说呢?不管有用没,还是想加上这句
老郭种树原创,转载请加上Spring笔记(01) 动态代理与反射
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注