aop this 与target 是接口 是类 的区别 使用Java代码 详细表达出来
时间: 2024-02-29 15:52:17 浏览: 136
在Java中,AOP中的this和target有一些区别,主要取决于它们所指向的对象是一个接口还是一个类。
如果this指向的是接口,则表示当前代理对象实现了该接口。这意味着任何针对该接口的方法调用都将被代理,并可以被AOP拦截和处理。但是,如果在代理对象上调用的方法不在该接口中定义,则将抛出异常。
如果target指向的是类,则表示当前代理对象是该类的子类或实例。这意味着任何针对该类中定义的方法的调用都将被代理,并可以被AOP拦截和处理。但是,如果在代理对象上调用的方法不在该类中定义,则将抛出异常。
下面是一个示例代码,演示了在使用Spring AOP时,如何使用this和target:
```java
public interface MyInterface {
public void doSomething();
}
public class MyClass implements MyInterface {
public void doSomething() {
System.out.println("Doing something...");
}
}
public class MyAspect {
public void beforeMethod() {
System.out.println("Before method...");
}
}
// 使用接口进行代理
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[] { MyInterface.class },
new MyAspect());
proxy.doSomething(); // 正常执行,并在控制台输出 "Before method..." 和 "Doing something..."
// 使用类进行代理
MyClass target = new MyClass();
MyClass proxy = (MyClass) Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[] { MyClass.class },
new MyAspect());
proxy.doSomething(); // 正常执行,并在控制台输出 "Before method..." 和 "Doing something..."
```
在这个示例中,我们首先定义了一个接口MyInterface和实现它的类MyClass。然后,我们定义了一个MyAspect类,它将在代理对象执行方法之前运行。我们使用两种方式来代理MyClass对象:一种是使用接口代理,另一种是使用类代理。在使用接口代理时,我们可以看到代理对象实现了MyInterface接口,并且在调用doSomething方法时,MyAspect中的beforeMethod方法被执行。在使用类代理时,我们可以看到代理对象是MyClass的子类,并且在调用doSomething方法时,MyAspect中的beforeMethod方法也被执行。
阅读全文