如何检查类是否有方面添加的方法?

时间:2014-07-11 09:54:27

标签: java aspectj inject

假设我有一个简单的类:

public class TestClass {
   /*...*/
}

我创建了一个方法,为这个类注入新方法:

public aspect TestAspect {
    public void TestClass.aspectMethod() {
        /*...*/
    }
} 

现在,如何在运行时检查TestClass是否TestAspect添加了方法?

2 个答案:

答案 0 :(得分:2)

最简单的方法是简单地反思课程:

TestClass.class.getDeclaredMethod("aspectMethod")

如果不存在,将抛出NoSuchMethodException。或者,如果你有字节,你可以使用字节代码访问者来检查字节代码中存在哪些方法 - 但反射路径可能不那么麻烦。

答案 1 :(得分:1)

安迪的答案是正确的,我只想回答你的评论后续问题:

Duck输入不是Java的功能,但是如果你使用ITD来使类实现一个接口,然后有一个方面扩展类的实例,你可以使用instanceof MyInterface来确定你的内容需要知道。其他方式(也使用反射)也可用:

稍后通过ITD与您想要添加的方法的接口:

package de.scrum_master.app;

public interface MyInterface {
    void myMethod();
}

示例驱动程序应用程序:

package de.scrum_master.app;

import java.lang.reflect.Type;

public class Application {
    public static void main(String[] args) {
        Application application = new Application();

        // Use an instance
        System.out.println(application instanceof MyInterface);
        System.out.println(MyInterface.class.isInstance(application));

        // Use the class
        for (Type type : Application.class.getGenericInterfaces())
            System.out.println(type);
        for (Class<?> clazz : Application.class.getInterfaces())
            System.out.println(clazz);
    }
}

<强>方面:

package de.scrum_master.aspect;

import de.scrum_master.app.Application;
import de.scrum_master.app.MyInterface;

public aspect MyAspect {
    declare parents : Application implements MyInterface;

    public void Application.myMethod() {}
}

应用输出

true
true
interface de.scrum_master.app.MyInterface
interface de.scrum_master.app.MyInterface