简介
对于使用相同功能代码段的实现方式如下:
图A 复制粘贴实现代码复用对于多处有相同的代码片段再后期维护、升级过程中将是噩梦。
图B吧相同代码封装成方法,在需要的地方调用即可。但是代码段2、代码段4以硬编码的方式调用相同代码。
AOP (Aspect Orient Programing,面向切面编程)代理
AOP 代理包含目标对象的所有方法,但是和目标对象方法有所差异,可以在目标对象方法前、后插入一些处理。
com.sxu.test.Test.java
package com.sxt.test;
import java.lang.reflect.*;
import com.sxt.test.Test.Testable;
public class Test {
static interface Testable {
void test1();
void test2(String args);
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Testable t = (Testable) Proxy.newProxyInstance(Testable.class.getClassLoader(),TestA.class.getInterfaces(),new MyInvocationHandler(new TestA()));
t.test1();
t.test2("你好");
}
}
//目标类 即被代理对象类
class TestA implements Test.Testable {
public void test1() {
System.out.println("TestA test1");
}
public void test2(String args) {
System.out.println("TestA test2");
}
}
//公共处理类
class CommonHander {
static void before() {
System.out.println("CommonHander before");
}
static void after() {
System.out.println("CommonHander after");
}
}
class MyInvocationHandler implements InvocationHandler {
private Testable target;
public MyInvocationHandler(Testable target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
CommonHander handler = new CommonHander();
handler.before(); //执行目标方法前插入其他方法
Object result = method.invoke(target, args);
handler.after(); //执行目标方法后插入其他方法
return result;
}
}
运行效果如下:
总结
使用AOP代理没有使用硬编码的方式实现了目标对象方法前、后插入其他方法!