PDA

View Full Version : [JAVA] Reflection


xplorer87
25-07-2007, 14:49
ciao ragazzi, ho un problemino con questo codice facile-facile:


Manager boss = new Manager("Paul Brown", 1000, 500);

Class c = boss.getClass();

try
{
Field field = c.getField("bonus");

Integer newBonus = field.getInt(boss);
newBonus = newBonus + 200;
field.setInt(boss, newBonus);

}
catch(NoSuchFieldException nsfe)
{
System.out.println(nsfe.getMessage());
nsfe.printStackTrace();
}
catch(IllegalAccessException iae)
{
System.out.println(iae.getMessage());
iae.printStackTrace();
}


com'e' facile capire, ho una classe Manager con un campo public (altrimenti avrei NoSuchFieldException) Integer bonus. vorrei modificarlo tramite reflection, ma ottengo un errore in questa riga:

Integer newBonus = field.getInt(boss);

Exception in thread "main" java.lang.IllegalArgumentException: Attempt to get java.lang.Integer field "dynamicbinding.Manager.bonus" with illegal data type conversion to int
at sun.reflect.UnsafeFieldAccessorImpl.newGetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.newGetIntIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.getInt(Unknown Source)
at java.lang.reflect.Field.getInt(Unknown Source)
at reflection.Main.main(Main.java:30)

illegal data type conversion to int? per noi comuni mortali cosa sarebbe? :)

grazie a tutti :)

PGI-Bis
25-07-2007, 15:12
Dice che "bonus" non è un "int". Prova con un "nonna":

...
Field field = c.getField("bonus");
System.out.println(field.getType());

e vedi di che tipo è. Magari è un BigInteger o un BigDecimal o un float.

xplorer87
25-07-2007, 15:23
mi sembra abbastanza ovvio che sia un integer, visto che il campo l'ho dichiarato io come public Integer bonus. infatti il metodo getType() conferma: class java.lang.Integer

PGI-Bis
25-07-2007, 15:46
Posto che un Integer non è un int, la soluzione è parimenti ovvia.

xplorer87
25-07-2007, 15:50
temo di non capire. un Integer non e' un int, ma qui si tratta unicamente di Integer: bonus e' un Integer e newBonus pure. se forse ti riferisci al fatto che il metodo getInt(String s) restituisce un int, la riga di codice

int newBonus = f.getInt(boss);

o anche

Integer newBonus = (Integer)f.getInt(boss);

da comunque lo stesso errore. quale sarebbe la soluzione?

PGI-Bis
25-07-2007, 16:02
ll problema è "getInt". Si aspetta che il campo sia un byte, short, char o int.

Se "bonus" è di tipo Integer, allora:

Integer newBonus = (Integer)field.get(boss);

xplorer87
25-07-2007, 16:11
perfetto, c'ero arrivato un nanosecondo fa :) ero stato tratto in inganno perche' pensavo che java facesse un po' meno impicci sulla questione int/Integer. piu' che altro uso classi wrapper a manetta perche' sono in un team di pure-OO fanboys ;)

grazie ancora!