Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [JAVA] Reflection

  1. #1

    [JAVA] Reflection

    ciao ragazzi, ho un problemino con questo codice facile-facile:

    codice:
                    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);

    codice:
    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
    and the black stones under my bare feet
    cold and smooth like her milk-white palm
    and the silence which falls upon this shore
    resounds now louder than oncoming storm
    for all is gone

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Conversione illegale. Stai tentando di assegnare un int ad un Integer.
    Prova
    codice:
    field.set(boss, new Integer(newBonus));

  3. #3
    ciao ^^

    grazie, ma comunque l'errore non e' in quella riga bensi' in questa: Integer newBonus = field.getInt(boss);

    comunque, "assegnazioni incrociate" di int e Integer non dovrebbero dare problemi, visto che Integer e' la classe wrapper del tipo di dato int :x
    and the black stones under my bare feet
    cold and smooth like her milk-white palm
    and the silence which falls upon this shore
    resounds now louder than oncoming storm
    for all is gone

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Non danno problemi nel caso in cui fai
    codice:
    Integer a = 10;
    ma getInt si usa per leggere interi. Non credo che nella sua implementazione faccia controlli sul tipo di classe.
    Piu' semplicemente se trova un reference ad un oggetto nella variabile indicata solleva eccezione in quanto non e' un int.
    Se utilizzi oggetti meglio usare get e set con opportuni controlli e cast.
    Secondo me se metti
    codice:
    Object obj = field.get(boss);;
    if(obj instanceof Integer) {
       Integer newBonus = (Integer)obj;
       newBonus = newBonus + 200;
       field.set(boss, newBonus);
    }
    ti va.

  5. #5
    esatto, ora cosi' va. il problema era che getInt restituisce un int, che non essendo un Integer crea problemi in fase di compilazione. bastava usare il get semplice con il cast come da te suggerito

    grazie mille
    and the black stones under my bare feet
    cold and smooth like her milk-white palm
    and the silence which falls upon this shore
    resounds now louder than oncoming storm
    for all is gone

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.