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

Java 获取具有特定属性的方法的名称,java,methods,Java,Methods,我正在做一个项目,需要列出某个类中具有某个属性的所有方法。 因此,我的问题分为两个阶段: 首先,我需要知道如何给一个方法一个特定的属性(我猜它叫做元数据,但我一点也不确定) 其次,我需要获得所有这些具有给定属性的方法的名称 PS:我知道如何获得一个类拥有的所有方法的名称 这是一个非常抽象的代码(我的原始代码没有什么特别之处,这对于回答我的问题至关重要,甚至是必要的) 因此,如果您能帮助我得到一个方法[]数组作为结果,该数组包含methodToSelect_1()和methodToSelect_2

我正在做一个项目,需要列出某个类中具有某个属性的所有方法。 因此,我的问题分为两个阶段:

首先,我需要知道如何给一个方法一个特定的属性(我猜它叫做元数据,但我一点也不确定)

其次,我需要获得所有这些具有给定属性的方法的名称

PS:我知道如何获得一个类拥有的所有方法的名称

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


因此,如果您能帮助我得到一个
方法[]
数组作为结果,该数组包含
methodToSelect_1()
methodToSelect_2()
,但不包含
Method_not_toSelect()
,我最近做了一些相同的工作。事实上,没有明显的方法可以做到这一点,你必须找到自己的解决方案。在我的例子中,我想得到getter,所以我做了这样的事情:

    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();
                }
            }
        }
    }
Method[]m=someObjectHavingMethods.getClass().getDeclaredMethods();
//循环方法数

对于(int i=0;i,多亏@Robert Knock的指示,我已经找到了问题的解决方案。我正在发布我的答案供将来参考

假设我们有以下包
annots\u package
和以下注释:

package annots_package;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface ToSelect {

    boolean selectable();

}
使用具有选择其他方法的方法的以下类: 软件包

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");
    }

}
import java.lang.reflect.Method;
导入java.util.ArrayList;
公共班机{
公共静态ArrayList selectedMethods=新建ArrayList();
公用干管(){
System.out.println(“实例化主节点”);
}
@ToSelect(可选=错误)
公共静态void main(字符串[]args)引发异常{
c类=Class.forName(“annots_package.Main”);
方法[]方法=c.getDeclaredMethods();
用于(方法:方法){
ToSelect annotation=method.getAnnotation(ToSelect.class);
if(注释!=null){
布尔可选=注释。可选();
如果(可选){
选择方法。添加(方法);
}
}
}
对于(方法:selectedMethods){
System.out.println(method.toString());
}
}
@ToSelect(可选=真)
公共作废方法_1(){
系统输出打印项次(“方法1”);
}
@ToSelect(可选=错误)
公共无效方法_2(){
系统输出打印项次(“方法2”);
}
@ToSelect(可选=真)
公开作废方法_3(){
系统输出打印项次(“方法3”);
}
}
因此,为了让我只选择注释为
@ToSelect(selective=true)
method\u 1()
method\u 3()
,我首先列出了类拥有的所有方法,然后为每个方法创建了一个注释,接下来,我检查注释是否为null(因为方法
main()
没有注释,它可能抛出一个
NullPointerException
),这样,我就避免了这种情况。只有这样,我才检查注释的
selective()
属性是否为
true
(可能是其他内容)。这样我就列出了我感兴趣的方法列表


谢谢大家。

“我知道如何获取一个类拥有的所有方法的名称。”那么问题是什么?“如何过滤数组?”在发布之前,你肯定已经在研究/尽职调查中找到了答案?什么标准规定第二个不应该被选择,而其他两个应该被包括在内?@RobertKock,这将通过回答我问题的第一部分来解决,如何赋予某些方法属性以区别于其他方法看起来您可能想使用自定义Java注释?请看以下内容:
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");
    }

}