Olá
Pegadinha: quem acertar vai ganhar um servidor de aplicação e uma IDE.
[color=green]Todo mundo aqui ([/color][color=red]no Java avançado[/color][color=green]) sabe que [/color][color=red]é possível[/color][color=green] mudar um campo [/color][color=red]private[/color][color=green] ou [/color][color=red]private final[/color][color=green], certo?[/color]
Vamos ver um exemplinho simples:
public class Tiozinho {
private String nome;
private final int idade = 60;
public String getNome() {
return nome;
}
public int getIdade() {
return idade;
}
}
Agora a classe que pretende alterar os campos private e private final:
import java.lang.reflect.Field;
public class FonteJuventude {
public static void main(String[] args) throws NoSuchFieldException {
Tiozinho tio = new Tiozinho();
// notar que getField(...) throws NoSuchFieldException
Field campoNome = Tiozinho.class.getDeclaredField("nome");
// Vamos alterar um campo private
campoNome.setAccessible(true);
try {
campoNome.set(tio, "Jenubaldo Canopilha");
} catch (IllegalAccessException e) {
System.out.println("Não foi possível trocar o nome");
}
Field campoIdade = Tiozinho.class.getDeclaredField("idade");
// Agora vamos alterar um campo private final
campoIdade.setAccessible(true);
try {
campoIdade.setInt(tio, tio.getIdade() - 30);
} catch (IllegalAccessException e) {
System.out.println("Não foi possível diminuir a idade");
}
// Vamos provar que funciona
try {
System.out.println("Nova idade = " + campoIdade.getInt(tio));
} catch (IllegalAccessException e) {
System.out.println("Não foi possível pegar a idade");
}
// Assim podemos escrever
System.out.println("Idade agora de " + tio.getNome() + " = " + tio.getIdade());
}
}
Vamos executar:
C:>javac Tiozinho.javaC:>javac FonteJuventude.java
C:>java FonteJuventude
Nova idade = 30
Idade agora de Jenubaldo Canopilha = 60C:>
Ops!
[color=red]Mudou o nome, mudou a idade mas depois imprimiu a idade antiga[/color]
E agora, alguém tem alguma explicação? Paulo? Louds? Sami? Maurício?
Com certeza a explicação existe e faz sentido.
[color=yellow] Uma dica: se mudar a inicialização do valor da idade de lugar, a fonte da juventude funcionará corretamente.[/color]
[]s
Luca [color=yellow](que copiou esta idéia do Eric Burke)[/color]
