Mudar o valor de um int com Reflection

5 respostas
C

Não sei se meu problema é básico ou avançado, mas como eu posso mudar o valor de um int usando Reflection? Eu consigo fazer um Integer que valia 2 valer 3, e se tratado como tal. Porém o mesmo não é possível ao meu ver com int. =/

Me ajudem por favor!

5 Respostas

Mauricio_Linhares

Claro que é, do mesmo jeito que você faz pro Integer vai fazer com o int também. Mostre o seu código ou o que você já tentou ai.

C
import java.lang.reflect.*;


public class principal {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
			Field fld;
			try {
				fld = Integer.class.getDeclaredField("value");
				fld.setAccessible(true);
				fld.set(2, 3);
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}

}

É apenas um exemplo simples, eu utilizo ele para alterar o valor de um Integer. Então caso eu queira imprimir o Integer 2, ele será tratado como 3. Porém o mesmo não funciona para int =/

Mauricio_Linhares

Isso realmente não pode, você não pode alterar o valor de uma literal, porque ela é, bem, uma literal :slight_smile:

E
import java.lang.reflect.*;

class ClasseComInt {
    public ClasseComInt (int x) { this.x = x; }
    public final int x;
	public int getX() { return x; }
}

class UsoIndevidoReflection {
    public static void main (String[] args) {
	    Integer dois = 2;
		System.out.printf ("O valor de 'dois' eh %d %n", dois);
		try {
		    Field field = Integer.class.getDeclaredField ("value");
			field.setAccessible (true);
			field.set (dois, Integer.valueOf (3));
		} catch (Exception ex) { }
		System.out.printf ("O valor de 'dois' agora eh %d - veja bem, %d %n", dois, 2);
		// Setando o valor de um 'int'. Nesse caso o campo é 'final' portanto não poderia ser mudado!
		ClasseComInt c = new ClasseComInt (5);
		System.out.printf ("O valor de c.x eh %d %n", c.getX());
		try {
		    Field field = ClasseComInt.class.getDeclaredField ("x");
			field.setAccessible (true);
			field.set (c, Integer.valueOf (7));
        } catch (Exception ex) { ex.printStackTrace(); }
		System.out.printf ("O valor de c.x agora eh %d%n", c.getX());
	}
}
C

Era o que eu suspeitava. Obrigado!

Criado 24 de agosto de 2011
Ultima resposta 25 de ago. de 2011
Respostas 5
Participantes 3