Galera,
tem alguma maneira de atribuir um novo valor para uma static final String?
Tentei o seguinte mas não consegui:
public class Teste {
public static final String TESTES = "xxx";
public static void main(String[] args) {
System.out.println(teste);
Field f;
try {
f = Teste.class.getDeclaredField("TESTES");
f.setAccessible(true);
f.set(null, "yyy");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(teste);
}
}
Sempre lança uma exception dizendo que não pode setar um objeto final…
Utilizando o setAccessible(true) achei que conseguiria pular essa etapa, mas não rolou. Já procurei bastante e não achei na web algo que funcionasse.
Se alguém puder ajudar.
EDIT: existe alguma forma de fazer isso mesmo que seja bem baixo nível/complicado? Ou por definição na jvm é realmente impossível ?
Como assim Exception ? O código não deveria nem compilar. E também não estou entendendo, se você precisa alterar o valor da variável ao longo do programa então ela não deve ser final. Se você precisa parametrizar o valor da variável você pode fazer isso no construtor.
Ah sim, somente agora vi que você está tentando fazer por Reflection, mesmo assim, não entendo o porque disso.
O que postei não compila porque colei uma versão com sysout, desconsidere.
E a coisa não é tão simples como vc pensa, eu tenho uma annotation que possui um atributo value:
// o value só aceita uma atribuição direta ou uma CONSTANTE.
// static final String TESTES
@Next(value = TESTES)
public void fazAlgo() {...}
O que eu precisaria é reatribuir esse value, pois em determinado momento eu quero que o @Next vá para um destino XXX e outro momento yyy, e etc etc etc.
Entendeu ?!
É muito simples. Não use final.
@Edit
Não havia visto o post acima.
O que postei não compila porque colei uma versão com sysout, desconsidere.
E a coisa não é tão simples como vc pensa, eu tenho uma annotation que possui um atributo value:
// o value só aceita uma atribuição direta ou uma CONSTANTE.
// static final String TESTES
@Next(value = TESTES)
public void fazAlgo() {...}
O que eu precisaria é reatribuir esse value, pois em determinado momento eu quero que o @Next vá para um destino XXX e outro momento yyy, e etc etc etc.
Entendeu ?!
[/quote]
Ta calma, qual a idéia deste @Next? Talvez ele possa ser substituido por outra coisa.
Amigo ja tive esse mesmo problema é não obtive nenhuma solução.
O que eu fiz foi na minha anotação eu passar parametros que na verdade seria o nome da classe e o nome do metodo para eu conseguir fazer a chamada do metodo via reflection e obter a String correta
Talvez a saída seja justamente não usar annotation. A razão dos parâmetros de uma annotation aceitarem somente literais e constantes é justamente o fato de ser um recurso que deve ser usado durante a escrita do programa, e não durante a execução. Talvez a saída seja criar uma interface com o método getNext() e fazer sua classe implementar esse método.
Particularmente, annotations e reflections são recursos que eu usaria apenas para metaprogramação. Para a maioria dos caso, OO resolve muito bem.
[quote=leonardobhbr]Amigo ja tive esse mesmo problema é não obtive nenhuma solução.
O que eu fiz foi na minha anotação eu passar parametros que na verdade seria o nome da classe e o nome do metodo para eu conseguir fazer a chamada do metodo via reflection e obter a String correta[/quote]
O único jeito de vc fazer isso é assim:
public class Teste {
public static final String[] TESTES = new String[]{"xxx"};
public static void main(String[] args) {
System.out.println(TESTES[0]);
TESTES[0] = "outro valor";
System.out.println(TESTES[0]);
}
}
Espero ter ajudado.