我正在开发一个项目,我需要列出某个具有特定属性的类的所有方法。 所以我的问题分为两个阶段:
首先,我需要知道如何为某个方法赋予某个属性(我猜它叫做元数据,但我根本不确定)。
其次,我需要获取具有给定属性的所有方法的名称。
PS:我知道如何获取类所有方法的名称。
这是一个非常抽象的代码(我的原始代码没有什么特别的,这对于回答我的问题至关重要甚至是必要的。)
class App{
public App(){}
public void methodToSelect_1(){}
public void method_NOT_toSelect(){}
public void methodToSelect_2(){}
}
如果你能帮助我获得包含Method[]
和methodToSelect_1()
但不包含methodToSelect_2()
的{{1}}数组,那就太棒了。
答案 0 :(得分:0)
我最近做了同样的工作。事实上,没有明显的方法可以做到这一点,你必须找到自己的解决方案。在我的情况下,我想得到吸气剂,所以我做了类似的事情:
Method[] m = someObjectHavingMethods.getClass().getDeclaredMethods();
// Loop over number of methods
for (int i=0;i<m.length;i++) {
// If methods contain "get" (case non-sensitive)
if (Pattern.compile(Pattern.quote("get"), Pattern.CASE_INSENSITIVE).matcher(m[i].toString()).find()) {
// If methods contain "someExpectedPattern" (case non-sensitive)
if (Pattern.compile(Pattern.quote("someExpectedPattern"), Pattern.CASE_INSENSITIVE).matcher(m[i].toString()).find()) {
try {
System.out.println(m[i].invoke(someObjectHavingMethods));
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
所以基本上你需要循环所有的方法,然后找到一种方法来选择你知道的方法,比如&#34; get&#34;对于吸气剂。
答案 1 :(得分:-1)
感谢@Robert Knock的指示,我找到了解决问题的方法。我发布我的答案以供将来参考。
所以说我们有以下包annots_package
和以下注释:
package annots_package;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface ToSelect {
boolean selectable();
}
使用以下具有选择其他方法的方法的类: package annots_package;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Main {
public static ArrayList<Method> selectedMethods = new ArrayList<Method>();
public Main() {
System.out.println("Instanciated Main");
}
@ToSelect(selectable = false)
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("annots_package.Main");
Method[] methods = c.getDeclaredMethods();
for(Method method : methods) {
ToSelect annotation = method.getAnnotation(ToSelect.class);
if(annotation != null) {
boolean selectable = annotation.selectable();
if (selectable) {
selectedMethods.add(method);
}
}
}
for(Method method : selectedMethods) {
System.out.println(method.toString());
}
}
@ToSelect(selectable = true)
public void method_1() {
System.out.println("method_1");
}
@ToSelect(selectable = false)
public void method_2() {
System.out.println("method_2");
}
@ToSelect(selectable = true)
public void method_3() {
System.out.println("method_3");
}
}
因此,为了让我只选择注释为method_1()
的{{1}}和method_3()
,我首先列出了该类具有的所有方法,然后为每个方法创建了一个注释。方法,接下来,我检查了注释是否为空(因为方法@ToSelect(selectable = true)
没有注释,它可以抛出main()
)所以这样,我避免了。然后我才检查注释的NullPointerException
属性是否为selectable()
(可能是其他内容)。这样我就得到了我感兴趣的方法的ArrayList。
谢谢大家。