比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类,有较高的耦合度。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程(AOP)。
部分说明来源于知乎用户
链接:https://www.zhihu.com/question/24863332/answer/48376158
UserService(接口):
链接:https://www.zhihu.com/question/24863332/answer/48376158
public interface UserService {
public void login();
public void register();
}
UserServiceImpl类(事项UserService接口):
public class UserServiceImpl implements UserService {
//连接点 可能被增强
@Override
public void login() {
System.out.println("登陆成功!!");
}
@Override
public void register() {
System.out.println("注册成功!!!");
}
}
Logging类(日志类):
public class Logging {
// 增强 通知
public static void log(){
System.out.println("日志信息");
}
}
Test(测试类):
public class TestProxy {
public static void main(String[] args) {
// 运行期间动态代理
// 实例化代理对象
// public static Object newProxyInstance(ClassLoader loader,
// @NotNull Class<?>[] interfaces,
// @NotNull reflect.InvocationHandler h) 织入的过程 增强的过程
// throws IllegalArgumentException
// 目标对象
UserService service = new UserServiceImpl();
UserService userproxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(),
service.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 通过反射机制调用目标对象的连接点
Object rnt = method.invoke(service,args);
Logging.log();
return rnt;
}
});
userproxy.login();
userproxy.register();
}
}