Resolvido - Setar campo como null via reflection

15 respostas
mateusviccari

Bom dia tenho o seguinte metodo:

Pessoa p=new Pessoa();
p.setNome("Mateus");
Method m = p.getClass().getDeclaredMethod("setNome", String.class);
m.invoke(p, "Bolo");
System.out.println(p.getNome());

Que executa normalmente
porem ao trocar a linha 4 pelo seguinte codigo

m.invoke(p, null);

Da o seguinte erro:

IllegalArgumentException: wrong number of arguments

Tem como setar como null um campo?

15 Respostas

Rodrigo_Sasaki

Sim, você pode manipular o Field diretamente.Foo foo = new Foo(); foo.setName("Foo"); System.out.println(foo.getName()); Field field = Foo.class.getDeclaredField("name"); field.set(foo, null); System.out.println(foo.getName());

ralphsilver

É o seguinte: você está deixando o reflection decidir por você o método que ele vai chamar…
o invoke tem várias chamadas como enviar um Object como parametro ou enviar um array de Object…

No seu caso… vc tem qeu fazer o cast no null para ele saber exatamente qual ele vai usar… ele deve estar tentando invocar o que tem array de objects aí:

Pessoa p=new Pessoa(); p.setNome("Mateus"); Method m = p.getClass().getDeclaredMethod("setNome", String.class); m.invoke(p, (Object)null); System.out.println(p.getNome());

ralphsilver

digaoneves:
Sim, você pode manipular o Field diretamente.Foo foo = new Foo(); foo.setName("Foo"); System.out.println(foo.getName()); Field field = Foo.class.getDeclaredField("name"); field.set(foo, null); System.out.println(foo.getName());

Se o field for private, vai dar pau!!!

Rodrigo_Sasaki

Eu sei, mas existe solução pra isso também.

A dúvida do autor do tópico foi: Tem como setar como null um campo?

Só exemplifiquei uma alternativa.

ralphsilver

digaoneves:
Eu sei, mas existe solução pra isso também.

A dúvida do autor do tópico foi: Tem como setar como null um campo?

Só exemplifiquei uma alternativa.

Hehehehehe nisso vc tem razão!!

pmlm

O método invoke recebe dois parâmetros, o objecto e um array de parâmetros. Ao passar null, estás a passar o array como null e não um array com um elemento null, que é o que é pretendido.

Não testei mas penso que assim funcionará

m.invoke(p, new Object[]{null});
mateusviccari

opa valeu galera fui testando de toda forma possivel aqui e desse jeito tambem funcionou:

m.invoke(p, new String[1]);
Rodrigo_Sasaki

mateusviccari:
opa valeu galera fui testando de toda forma possivel aqui e desse jeito tambem funcionou:

m.invoke(p, new String[1]);


É, é uma solução equivalente à do pmlm

ralphsilver

mateusviccari:
opa valeu galera fui testando de toda forma possivel aqui e desse jeito tambem funcionou:

m.invoke(p, new String[1]);

Também funciona… pois vc especificou que tem que mandar um vetor como parâmetro…
Eu testei o que eu te mandei… e funciona também (fazer cast no null)

renanreismartins

sei que não foi a pergunta inicial, mas vi que estão fazendo reflection na mao. E isso dói…

recomendo mto dar uma olhada no mirror dsl, utilizo uso intenso de reflection aqui e tem me ajudado mto

abrass

ralphsilver

renanreismartins:
sei que não foi a pergunta inicial, mas vi que estão fazendo reflection na mao. E isso dói…

recomendo mto dar uma olhada no mirror dsl, utilizo uso intenso de reflection aqui e tem me ajudado mto

abrass

Vou dar uma olhada… de qualquer forma… apenas fui no sentido da dúvida do nosso amigo… mas normalmente para trabalhar com reflections eu utilizo commons-beanutils

renanreismartins

bom saber, n usei a commons-beanutils ainda

abrassss

ralphsilver

renanreismartins:
bom saber, n usei a commons-beanutils ainda

abrassss

O bom de usar ele é que é a api padrão que os grandes frameworks utilizam… aí não precisa ficar preocupado em incluir eles nas dependências do projeto, porque normalmente eles já são incluídas quando se incluem frameworks como spring, hibernate e jsf

mateusviccari

ralphsilver:
renanreismartins:
bom saber, n usei a commons-beanutils ainda

abrassss

O bom de usar ele é que é a api padrão que os grandes frameworks utilizam… aí não precisa ficar preocupado em incluir eles nas dependências do projeto, porque normalmente eles já são incluídas quando se incluem frameworks como spring, hibernate e jsf

Como eu faço pra usar essa API tendo o hibernate configurado no projeto?

ralphsilver

mateusviccari:
ralphsilver:
renanreismartins:
bom saber, n usei a commons-beanutils ainda

abrassss

O bom de usar ele é que é a api padrão que os grandes frameworks utilizam… aí não precisa ficar preocupado em incluir eles nas dependências do projeto, porque normalmente eles já são incluídas quando se incluem frameworks como spring, hibernate e jsf

Como eu faço pra usar essa API tendo o hibernate configurado no projeto?

Assim

PropertyUtils.setProperty(p, "nome", "value");

Leve em conta que ele serve para ser usado com padrão java bean… então… para ele setar o atributo nome… ele vai invocar o método “setNome”… assim como o getProperty

PropertyUtils.getProperty(p, "nome");

que vai pegar o dado do atributo através do método “getNome”

Criado 10 de setembro de 2012
Ultima resposta 10 de set. de 2012
Respostas 15
Participantes 5