动态代理与反射。动态代理,增强方法。
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);
}
本文由老郭种树原创,转载请注明:https://guozh.net/spring-proxy-reflect-improve-method/