Tem alguma forma de reatribuir um valor para uma "static final String xx"?

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.