获取具有特定属性的方法的名称

时间:2018-04-19 12:56:25

标签: java methods

我正在开发一个项目,我需要列出某个具有特定属性的类的所有方法。 所以我的问题分为两个阶段:

首先,我需要知道如何为某个方法赋予某个属性(我猜它叫做元数据,但我根本不确定)。

其次,我需要获取具有给定属性的所有方法的名称。

PS:我知道如何获取类所有方法的名称。

这是一个非常抽象的代码(我的原始代码没有什么特别的,这对于回答我的问题至关重要甚至是必要的。)

class App{
    public App(){}

    public void methodToSelect_1(){}

    public void method_NOT_toSelect(){}

    public void methodToSelect_2(){}
}

如果你能帮助我获得包含Method[]methodToSelect_1()但不包含methodToSelect_2()的{​​{1}}数组,那就太棒了。

2 个答案:

答案 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。

谢谢大家。