切面编程--使用JDK动态代理
1.使用JDK动态代理
对于直接使用JDK的动态代理的类的缺点:
1.对于实现代理的类,必须要实现接口,否则没有办法实现代理
2.写起来太难
接口:
package com.proxy.jdk;
public interface Calculater {
public double add(double x, double y);
public double cut(double x, double y);
}
接口的实现类:
package com.proxy.jdk;
public class MyCalculater implements Calculater {
@Override
public double add(double x, double y) {
return x + y;
}
@Override
public double cut(double x, double y) {
return x - y;
}
}
实现类的代理类:
package com.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MycalProxy {
public static Calculater getMyCalProxy(final Calculater calculater) {
ClassLoader loader = calculater.getClass().getClassLoader();
Class<?>[] interfaces = calculater.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
/**
*
* @param proxy 代理对象,任何时候都不要动这个对象
* @param method 当前要执行的目标对象的方法
* @param args 要传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射执行目标方法
//目标方法执行后的返回值
System.out.println("方法执行之前我执行的操作。。。");
Object result=method.invoke(calculater,args);
System.out.println("方法执行之后我执行的操作。。。"+result);
return result;
}
};
Object object = Proxy.newProxyInstance(loader, interfaces, h);
return (Calculater) object;
}
}
测试类:
package com.proxy.jdk;
public class Test {
public static void main(String[] args) {
Calculater calculater = new MyCalculater();
Calculater mycalProxy = MycalProxy.getMyCalProxy(calculater);
System.out.println(mycalProxy.add(1, 8));
}
}