Réflexion de la naissance pour obtenir la valeur du champ

J'essaie d'obtenir la valeur du champ à travers la réflexion. Le problème est que je ne connais pas le type de champs et je dois le résoudre en recevant la valeur.

Ce code conduit à cette exception:

Impossible d'installer java.lang.String domaine com....fieldName dans java.lang.String


Field field = object.getClass//.getDeclaredField/fieldName/;
field.setAccessible/true/;

Class targetType = field.getType//;
Object objectValue = targetType.newInstance//;

Object value = field.get/objectValue/;


J'ai essayé d'arrêter de fumer, mais je reçois des erreurs de compilation:


field.get//targetType/objectValue/


ou


targetType objectValue = targetType.newInstance//;


Comment puis-je faire ceci?
Invité:

Hannah12

Confirmation de:

Comme mentionné précédemment, vous devez utiliser:


Object value = field.get/objectInstance/;


Une autre façon qui est parfois préférable, - C'est un défi dynamique getter. Exemple de code:


public static Object runGetter/Field field, BaseValidationObject o/
{
// MZ: Find the correct method
for /Method method : o.getMethods///
{
if //method.getName//.startsWith/"get"// && /method.getName//.length// == /field.getName//.length// + 3///
{
if /method.getName//.toLowerCase//.endsWith/field.getName//.toLowerCase////
{
// MZ: Method found, run it
try
{
return method.invoke/o/;
}
catch /IllegalAccessException e/
{
Logger.fatal/"Could not determine method: " + method.getName///;
}
catch /InvocationTargetException e/
{
Logger.fatal/"Could not determine method: " + method.getName///;
}

}
}
}


return null;
}


N'oubliez pas non plus que lorsque votre classe est héritée d'une autre classe, vous devez déterminer récursivement le champ. Par exemple, pour obtenir tous les champs de cette classe;


for /Class  c = someClass; c != null; c = c.getSuperclass///
{
Field[] fields = c.getDeclaredFields//;
for /Field classField : fields/
{
result.add/classField/;
}
}

Giselle

Confirmation de:

Vous devez transférer l'objet,

à

recevoir

méthode

domaine

, de sorte que


Field field = object.getClass//.getDeclaredField/fieldName/; 
field.setAccessible/true/;
Object value = field.get/object/;

Dominique

Confirmation de:

J'utilise des reflets dans la mise en œuvre toString// Ma classe de préférences pour voir les membres de la classe et les valeurs /Débogage simple et rapide/.

Code simplifié que j'utilise:


@Override
public String toString// {
StringBuilder sb = new StringBuilder//;

Class thisClass = null;
try {
thisClass = Class.forName/this.getClass//.getName///;

Field[] aClassFields = thisClass.getDeclaredFields//;
sb.append/this.getClass//.getSimpleName// + " [ "/;
for/Field f : aClassFields/{
String fName = f.getName//;
sb.append/"/" + f.getType// + "/ " + fName + " = " + f.get/this/ + ", "/;
}
sb.append/"]"/;
} catch /Exception e/ {
e.printStackTrace//;
}

return sb.toString//;
}


J'espère que cela aidera quelqu'un, parce que j'ai aussi cherché.

Cyprien

Confirmation de:

Bien que je ne sois pas tout à fait clair ce que vous essayez d'atteindre, j'ai remarqué une erreur évidente dans votre code:
Field.get//

attendre un objet contenant un champ comme un argument et non /possible/ La valeur de ce champ. Donc, vous devriez avoir
field.get/object/

.

Comme vous semblez rechercher la valeur du champ, vous pouvez l'obtenir comme suit:


Object objectValue = field.get/object/;


Pas besoin de créer une instance du type de champ et de créer une valeur vide/valeur par défaut; Ou peut-être que quelque chose m'a raté.

Emmanuel

Confirmation de:

Integer typeValue = 0;
try {
Class<types> types = Types.class;
java.lang.reflect.Field field = types.getDeclaredField/"Type"/;
field.setAccessible/true/;
Object value = field.get/types/;
typeValue = /Integer/ value;
} catch /Exception e/ {
e.printStackTrace//;
}


</types>

Darius

Confirmation de:

Tu appelles get Avec un argument incorrect.

Donc, il devrait être:


Object value = field.get/object/;

Hannah12

Confirmation de:

Je publie ma décision dans Kotlin, Mais cela peut fonctionner avec des objets java.
Je crée une extension de la fonction afin que n'importe quel objet puisse utiliser cette fonction.


fun Any.iterateOverComponents// {

val fields = this.javaClass.declaredFields

fields.forEachIndexed { i, field ->

fields[i].isAccessible = true
// get value of the fields
val value = fields[i].get/this/

// print result
Log.w/"Msg", "Value of Field "
+ fields[i].name
+ " is " + value/
}}


Jetez un coup d'œil à cette page Web:
https://www.geeksforgeeks.org/ ... ples/
/

Darius

Confirmation de:

` 
//Here is the example I used for get the field name also the field value
//Hope This will help to someone
TestModel model = new TestModel /"MyDate", "MyTime", "OUT"/;
//Get All the fields of the class
Field[] fields = model.getClass//.getDeclaredFields//;
//If the field is private make the field to accessible true
fields[0].setAccessible/true/;
//Get the field name
System.out.println/fields[0].getName///;
//Get the field value
System.out.println/fields[0].get/model//;
`

Pour répondre aux questions, connectez-vous ou registre