我们可以使用 AspectJ 创建或实例化一个对象并访问对象的属性和方法吗?我知道使用 AspectJ 我们可以获取方法的输入参数,但是它与对象创建相同吗?
例如,在代码中有这一行
testing test = new testing();
我想使用AspectJ获取测试对象并访问类testing()的方法和变量,例如方法aa()。
这是测试类的代码。
package testMaven;
public class testing {
public int dd;
public int getDd() {
return dd;
}
public void setDd(int dd) {
this.dd = dd;
}
public void aa(int a){
System.out.println(a);
}
}
真正的编码问题
上面的编码只是我目前遇到的问题的抽象问题的一个例子。感谢下面的答案,它在这个示例中有效,但在我的实际项目中它不起作用。基本上代码如下:
@After("execution(de.hpi.cloudraid.dto.control.storedObjectService.CreateFileFinalResponseDto.new(..))")
public void constructorInvocation(JoinPoint joinPoint) throws Throwable {
CreateFileFinalResponseDto instance = (CreateFileFinalResponseDto) joinPoint.getTarget();
System.err.println("testing new object creation");
System.err.println("id upload = " + instance.getFileObjectID());
}
但是代码不起作用,因为它给出了尚未应用建议的警告(xlint:adviceDidNotMatch)。 CreateFileFinalResponseDto 类基本上来自称为共享的不同项目,我已经将共享项目包含在 pom.xml 和 AspectJ 依赖项和插件中,如下所示:
<dependencies>
<!-- Project -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>shared</artifactId>
<version>${project.server.version}</version>
</dependency>
...
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<showWeaveInfo>true</showWeaveInfo>
</configuration>
<executions>
<execution>
<id>AspectJ-Classes</id>
<phase>process-classes</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>AspectJ-Test-Classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
感谢任何帮助。谢谢
最佳答案
要捕获类实例化,可以使用以下方面:
@Aspect
public class Interceptor {
/**
* Matches constructor testMaven.testing.
* <p/>
* *NOTE:* This will only work when class compiled with aspectj.
*/
@After("execution(* testMaven.testing.new(..))")
public void constructorInvocation(JoinPoint joinPoint)
throws Throwable {
testing instance = (testing) joinPoint.getTarget();
instance.aa(2);
}
}
如果你想捕获Before
的实例化,当然不会有实例。
关于java - 使用 AspectJ 获取对象实例化并访问其相关属性和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563258/