2015-12-15 10 views
10

Come tutti sappiamo, la riflessione Java fornisce il metodo Class.getConstructors, ma come è l'ordine dell'array Constructor<?>[]?Come è l'ordine dell'array cosa restituisce Class.getConstructors() in Java

Per esempio, creo classe Persona e ci sono 3 metodo costrutto:

public Person() 
{ 
} 

public Person(int age) 
{ 
    this.age = age; 
} 

public Person(int age, String name) 
{ 
    this.age = age; 
    this.name = name; 
} 

E per il debug, trovo l'ordine di schieramento costruttore in questo modo:

0 = public xxx.Person(int) 
1 = public xxx.Person(int, java.lang.String) 
2 = public xxx.Person() 
+1

perché è così importante? cosa provi? –

+0

Questo non è documentato. Quindi non c'è una risposta affidabile. Puoi presumere che sia solo un ordine arbitrario. – RealSkeptic

+0

Quando guardo il [Class # getDeclaredConstructors() -method] (http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredConstructors()) ho notato quanto segue line: "_ Gli elementi nella matrice restituita non sono ordinati e non sono in un ordine particolare._" Al [Class # getConstructors() -method] (http://docs.oracle.com/javase/7/docs/ api/java/lang/Class.html # getConstructors()) questo non è menzionato però. : S Il mio assunto è che lo stesso vale per quel metodo, e anche il tuo codice lo dimostra, ma non ne sono sicuro al 100%. –

risposta

1

Quando guardo il Class#getDeclaredConstructors()-method ho notato la seguente riga:

"Gli elementi della matrice restituita non sono allineati e non sono in alcun ordine particolare."

Al Class#getConstructors()-method questo non è menzionato anche se .. Anche se non è detto, la mia ipotesi è che lo stesso vale per quel metodo, che il codice tipo di prova.

Non sono sicuro di ciò che si vuole realizzare (forse si potrebbe aggiungere l'obiettivo alla propria domanda in modo che potremmo essere in grado di aiutarla ulteriormente), ma non penso sia possibile ottenere i costruttori nello stesso ordinare usando la riflessione.


EDIT: Con i costruttori nel tuo esempio, è possibile chiamare uno dei tre in questo modo:

Class<Person> pClass = Person.class; 
pClass.getDeclaredConstructor().newInstance(); // default constructor 
pClass.getDeclaredConstructor(int.class).newInstance(50); // constructor with int parameter 
pClass.getDeclaredConstructor(int.class, String.class).newInstance(50, "test"); // constructor with int and String parameters 
+1

Grazie Kevin, non dovrei preoccuparmi per l'ordine e l'ordine è inutile. Ma posso usare 'getDeclaredConstructor (Object ... params)' per risolvere il mio problema. :) – BadEgg

0

La classe Class ha diversi metodi simili, come getInterfaces, getTypeParametrers, getMethods, getFields, ecc.

Nella maggior parte dei casi, quando l'ordine è ben definito, viene specificato in javadoc. Ad esempio, getInterfaces:

L'ordine degli oggetti di interfaccia nella matrice corrisponde all'ordine dei nomi di interfaccia nella clausola attrezzi della dichiarazione della classe rappresentata dall'oggetto

javadoc di getConstructors non commenta l'ordine e non dovresti quindi fare affidamento sull'ordine specifico che hai osservato poiché potrebbe cambiare tra JVM e forse anche da una corsa all'altra.

0

L'ordine non è specificato. Il javadoc per il metodo Class.getConstructors() non fa alcun riferimento all'ordine dei costruttori.

Ciò significa che anche se è possibile capire cosa determina l'ordine, non è possibile fare affidamento sull'ordine di essere lo stesso in tutte le versioni di JVM.

interessante notare che la javadoc per le le Class.getMethods() metodo stati particolare che non si deve fare affidamento su l'ordine dei metodi restituiti.

1

Poiché l'ordine del costruttore non è rilevante per le classi java, non esiste una specifica per l'ordine del metodo getConstructors. Penso che il test possa capire l'ordine predefinito, ma non lo userò come può cambiare in qualsiasi momento. Se si desidera ottenere parametri specifici per il controllo del costruttore o se l'ordine è importante, il file .java viene elaborato come un semplice file di testo.

Java documentions.

restituisce una matrice contenente oggetti Constructor riflette tutte le costruttori pubblici della classe rappresentata dall'oggetto Class. Un array di lunghezza 0 viene restituito se la classe non ha costruttori pubblici, o se la classe è una classe di matrice o se la classe riflette un tipo primitivo o vuoto. Si noti che mentre questo metodo restituisce una matrice di oggetti Constructor (ovvero una matrice di costruttori da questa classe ), il tipo restituito da questo metodo è Constructor [] e non Constructor [] come previsto.Questo tipo di ritorno meno informativo è necessario poiché dopo essere stato restituito da questo metodo, l'array potrebbe essere modificato per contenere oggetti Constructor per diverse classi , che violerebbero le garanzie di tipo di Constructor []. Restituisce: