Hay alguna forma de conseguir una de las clases declaradas campos (y métodos) en el orden de declaración de uso de la reflexión? Según la documentación, el orden de los Métodos y de los Campos devueltos por getFields(), getDeclaredFields(), etc. es indefinido.

Especificar algo como un índice sería posible mediante el uso de la anotación como se sugiere en Java reflexión: Es el orden de los campos de la clase y los métodos estandarizados?

Hay mejores opciones, es decir, no tener que especificar el índice manualmente?

Ahora, antes de pedir lo que necesitas para: tenemos un método que toma bastante grande estructura de datos como entrada y realiza un largo cálculo en él. Para crear la unidad de pruebas, hicimos un método que toma un objeto de entrada y una de salida de instancia y crea el código fuente de Java (configuración de entrada, invocando el método de cálculo, y hacer valer los resultados correctos después) como de salida. Este código es mucho más legible cuando los campos se escriben en orden de declaración.

InformationsquelleAutor Axel | 2011-02-15

6 Comentarios

  1. 11

    Con jdk 6, el reflejo de los campos están en acción en su orden de declaración. A principios de jdk que no era el caso. Aparentemente suficiente de personas han atormentado.

    Aunque no se garantiza por el javadoc, quiero aprovechar esta orden se concede, y supongo que la orden se mantendrá en el futuro jdks demasiado.

    En su aplicación, como en la mayoría de las aplicaciones de la dependencia en el orden de declaración es en su mayoría de la vanidad – su aplicación no va a fallar si el orden de los tornillos, que acaba de convertirse en un poco más fea.

    • Elijo esta respuesta. Incluso si no se garantiza por la documentación, a mí me funciona.
    • podría proporcionar un enlace a esta ? o se trataba de observación con base en su experiencia única ?
    • Que se ejecutan en Oracle JVM versión 1.7 encontré el pedido de no coincidir con el orden de declaración.
    • Dalvik no coincide con el orden de declaración también
    • Ellos no están en el orden de lo declarado. Acabo de probar esto.
    • Independientemente de cómo la particular JRE Reflexión de la aplicación se encarga de esto, ni siquiera hay una garantía acerca de cómo el compilador almacena los miembros de los archivos de clase, por lo tanto, el JRE no habría una oportunidad para reconstituir el orden de declaración, si el pedido se ha perdido en el tiempo de compilación ya. Así que incluso con el JDK6 aplicación que parece suceder a mantener el orden, no hay ninguna garantía.

  2. 5

    No, no es posible con la reflexión. Usted podría, sin embargo resolverlo mediante un ProcessBuilder y la javap comando:

    Dado un 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;
        }
    }

    El comando javap Test imprime:

    ...
    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

    He tenido esto como un problema aislado, mira

    https://github.com/wmacevoy/kiss/blob/master/src/main/java/kiss/util/Reflect.java

    y el método

    Método estático público[] getDeclaredMethodsInOrder(Clase-clazz)

    Llega el fin de mirar el código de bytes de la clase. Si sólo desea utilizar el libray, sería la
    kiss.util.Reflect.getDeclaredMethodsInOrder(Test.class)

    • Pero no hay ninguna garantía de que el código de bytes de la clase refleja el orden de el código fuente…
    • Convenido; pero la sección de declaración de la bytecode en el hecho de no tenerlos en orden de declaración, como se ha probado en el JDK 1.7 y 1.8. Android Jack y Jill no se analiza (y por lo tanto no clasificado), pero Android no volver a todos los métodos declarados orden, por lo que el código funciona en todos los principales actuales contextos.
    • Funciona bastante bien para mí gracias
  4. 2

    Me temo que es imposible, sin modificar el proceso de compilación. Normalmente, el campo escrito en el classfile en cualquier orden y la información sobre el orden de declaración se pierde.

    Más probable es que usted podría utilizar una anotación procesador para escribir la orden en un archivo auxiliar.

    Que debería ser bastante fácil. Mira por ejemplo en interfacegen para un ejemplo, de cómo una anotación procesador puede trabajar. Usted puede poner la información en el mismo archivo, pero esto es mucho más difícil.

  5. 1

    Usted puede pensar en el uso de Javadoc con una costumbre Doclet, pero esto requiere que el código fuente esté disponible.

    Todavía no hay garantía sobre el orden en el API (métodos, campos, pero cada javadoc de salida que he visto tiene de ellos en el orden correcto, así que supongo que la doclets obtener de ellos en el orden de declaración.

  6. 0

    Usted no será capaz de obtener la información desde el archivo de clase. Como dijo Adam en una respuesta a la refrenced otra pregunta:

    Los elementos en la matriz devuelta no están ordenados y no están en ningún orden en particular.

    Y «sin fin» incluye «ninguna orden de declaración».

    Alguna vez he utilizado una fuente de Java analizador de archivos para obtener los datos de entrada para los generadores de código. Y de esta manera tendrás los campos y métodos en el orden de declaración.

Dejar respuesta

Please enter your comment!
Please enter your name here