aop this 与target区别 使用Java代码 详细表达出来
时间: 2024-02-29 16:51:12 浏览: 51
aop思想的java实现
在AOP编程中,`this`和`target`都是关键字,用于表示当前被代理的对象。它们的区别在于,`this`关键字表示当前正在执行的对象,而`target`关键字表示被代理的目标对象。
下面是一个使用Java代码演示`this`和`target`关键字的例子:
```java
public interface UserService {
void addUser(User user);
}
public class UserServiceImpl implements UserService {
public void addUser(User user) {
System.out.println("add user: " + user);
}
}
public class LogAspect {
public void before(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
System.out.println("target object: " + target);
Object aThis = joinPoint.getThis();
System.out.println("this object: " + aThis);
}
}
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
LogAspect logAspect = new LogAspect();
ProxyFactory proxyFactory = new ProxyFactory(userService);
proxyFactory.addAdvice(logAspect);
UserService proxy = (UserService) proxyFactory.getProxy();
User user = new User("Tom");
proxy.addUser(user);
}
}
```
在这个例子中,我们定义了一个`UserService`接口和它的实现类`UserServiceImpl`,并且定义了一个切面`LogAspect`用于对`UserService`的`addUser`方法进行增强。在`LogAspect`切面中,我们打印出了`target`和`this`对象。
在`main`方法中,我们创建了一个`UserService`实例和一个`LogAspect`实例,并且使用`ProxyFactory`来创建一个代理对象。当我们调用代理对象的`addUser`方法时,`LogAspect`中的`before`方法会被调用,并且打印出`target`和`this`对象。
当我们运行这个程序时,输出结果为:
```
target object: com.example.UserServiceImpl@1b6d3586
this object: com.example.UserServiceImpl@1b6d3586$$EnhancerBySpringCGLIB$$d2cb7e0f
add user: User{name='Tom'}
```
从输出结果中可以看出,`target`对象是`UserServiceImpl`的实例,而`this`对象是代理对象的实例,它是`UserServiceImpl`的子类,通过CGLIB动态生成的。这表明在代理对象中,`this`关键字表示代理对象,而`target`关键字表示被代理的目标对象。
阅读全文