假设我有一个简单的类:
public class TestClass {
/*...*/
}
我创建了一个方法,为这个类注入新方法:
public aspect TestAspect {
public void TestClass.aspectMethod() {
/*...*/
}
}
现在,如何在运行时检查TestClass
是否TestAspect
添加了方法?
答案 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