Resolvido - Setar campo como null via reflection

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?

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());

É 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());

[quote=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());[/quote]

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

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.

[quote=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.[/quote]

Hehehehehe nisso vc tem razão!!

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});  

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

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

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

m.invoke(p, new String[1]); [/quote]
É, é uma solução equivalente à do pmlm

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

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

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)

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

[quote=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[/quote]

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

bom saber, n usei a commons-beanutils ainda

abrassss

[quote=renanreismartins]bom saber, n usei a commons-beanutils ainda

abrassss[/quote]

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

[quote=ralphsilver][quote=renanreismartins]bom saber, n usei a commons-beanutils ainda

abrassss[/quote]

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[/quote]

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

[quote=mateusviccari][quote=ralphsilver][quote=renanreismartins]bom saber, n usei a commons-beanutils ainda

abrassss[/quote]

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[/quote]

Como eu faço pra usar essa API tendo o hibernate configurado no projeto?[/quote]

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”