java - 使用 AspectJ 获取对象实例化并访问其相关属性和方法

标签 java aop aspectj

我们可以使用 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/

相关文章:

java - 没有 Spring 的 AOP 和 JMX 问题

java - 单击按钮时将图像放置在随机网格点上

java - 在 AspectJ set-pointcut 中公开先前的值

c++ - 经典C++(C with Classes)的Call/Return特性,现代语言有哪些?

java - AspectJ - 记录 HttpServletRequest

java - 仅使用 AspectJ 将切面应用于带注释的方法(不使用 Spring)

java - aspectj 中的 After()

java - Android - 如何使用逗号或点作为小数点分隔符将字符串解析为数字

java - 在android中合并音频和视频文件

java - HBase 中的原子比较和增量