有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java反射:按声明顺序获取字段和方法

有没有办法按照使用反射声明的顺序获取类声明的字段(和方法)?根据文档,由getFields()getDeclaredFields()等返回的方法和字段的顺序未定义

可以使用Java reflection: Is the order of class fields and methods standardized?中建议的注释指定类似索引的内容

是否有更好的选择,即不必手动指定索引

现在在你问我需要这个做什么之前:我们有一个方法,它将一个相当大的数据结构作为输入,并对其执行冗长的计算。为了创建单元测试,我们创建了一个方法,该方法接受一个输入对象和一个输出实例,并创建Java源代码(设置输入,调用计算方法,然后断言正确的结果)作为输出。当字段按声明顺序编写时,此代码的可读性要高得多


共 (6) 个答案

  1. # 1 楼答案

    恐怕不修改编译过程是不可能的。通常,字段会以任意顺序写入类文件,有关声明顺序的信息会丢失

    很可能您可以使用注释处理器将顺序写入辅助文件

    这应该很容易。例如,在interfacegen上查看注释处理器如何工作的示例。您可能希望将信息放在同一个文件中,但这要困难得多

  2. # 3 楼答案

    不,反射是不可能的。但是,您可以使用ProcessBuilderjavap命令来解决它:

    给定一个Test.java

    public abstract class Test {
    
        public void method1() {
        }
    
        public void method2() {
        }
    
        public static void main(String[] args) {
        }
    
        public String method3() {
            return "hello";
        }
    
        abstract void method4();
    
        final int method5() {
            return 0;
        }
    }
    

    命令javap Test打印:

    ...
    public Test();
    public void method1();
    public void method2();
    public static void main(java.lang.String[]);
    public java.lang.String method3();
    abstract void method4();
    final int method5();
    ...
    
  3. # 4 楼答案

    对于jdk 6,反射字段实际上是按照其声明顺序进行的。在早期的jdk中,情况并非如此。显然有足够多的人在唠叨

    虽然javadoc没有保证,但我仍然认为这个订单是理所当然的,并且我假设这个订单也将保留在未来的jdk中

    在你的应用程序中,就像在大多数应用程序中一样,对声明顺序的依赖主要是虚荣——如果顺序搞砸了,你的应用程序不会失败,只是会变得更加丑陋

  4. # 5 楼答案

    您可能会考虑将Javadoc与自定义Doclet一起使用,但这需要源代码可用

    对于API(methodsfields)中的顺序仍然没有保证,但是我见过的每个javadoc输出都有正确的顺序,所以我想doclet是按照声明顺序获得它们的

  5. # 6 楼答案

    您将无法从类文件中获取信息。正如亚当在回答被引用的另一个问题时所说:

    The elements in the array returned are not sorted and are not in any particular order.

    “无订单”包括“无申报订单”

    我曾经使用Java源文件解析器为代码生成器获取输入数据。这样,字段和方法将按声明顺序排列