首先创建代理类:
public interface Flying {
void m1();
int m2(int num);
}
接着创建被代理的业务逻辑类来实现代理类,并重写被代理的方法:
/**
* @decription: 业务逻辑类,也是被代理的类
*/
public class Swan implements Flying {
@Override
public void m1() {
System.out.println("方法一");
}
@Override
public int m2(int num) {
System.out.println("方法二");
return num;
}
}
接着真正实现Java中的动态代理(实现InvocationHandler接口):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @decription: Java中提供的动态代理
*/
public class MyLog implements InvocationHandler {
private Object target;//要代理的目标
//使用构造方法传入要代理的目标
public MyLog(Object target) {
this.target = target;
}
/**
* 横切面逻辑
*
* @param proxy 产生代理的实例
* @param method 需要代理的方法
* @param args 方法参数
* @return 代理方法的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//方法执行之前做的事情
System.out.println("Method before....");
//使用反射执行方法
Object result = method.invoke(target, args);
//方法执行之后要做的事情
System.out.println("Method after....");
return result;
}
}
最后编写测试类:
import java.lang.reflect.Proxy;
/**
* @decription: 测试
*/
public class Test {
public static void main(String[] args) {
Swan swan = new Swan();
//获取代理
Flying flying = (Flying) Proxy.newProxyInstance(Test.class.getClassLoader(),
swan.getClass().getInterfaces(),
new MyLog(swan));
flying.m1();
System.out.println("--------------------------");
int result = flying.m2(100);
System.out.println(result);
}
}
运行测试可看到结果:
使用代理执行方法,在方法执行之前和之后我们自己加入的横切面逻辑代码也会执行,实现了切面编程。