Reflection com métdos privados

3 respostas
sunshine

Pessoal,

há possibilidade de executar um método privado através de reflexão, sendo que a execução não seja na mesma classe do método?
Lembrem isto é somente um exemplo o set e get privado.
Ex.:

private void setAlgumaCoisa(String algumaCoisa){
        this.algumaCoisa = algumaCoisa;
}

private String getAlgumaCoisa() {
        return algumaCoisa;
}

test

public void testSeSetAlgumaCoisa() throws Exception {
        Piso algumaCoisa = Piso.class.newInstance();
        Method metodoSet = Piso.class.getDeclaredMethod("setAlgumaCoisa", String.class);
        Method metodoGet = Piso.class.getDeclaredMethod("getAlgumaCoisa");

        metodoSet.invoke(algumaCoisa, "meu deus");
        assertEquals("meu deus", metodoGet.invoke(algumaCoisa));
}

erro

java.lang.IllegalAccessException: Class com.ancar.importacaoScipa.modelo.PisoTeste
can not access a member of class 
com.ancar.importacaoScipa.modelo.Piso with modifiers "private"

3 Respostas

_fs
if( method.getModifiers() != Member.PUBLIC )
	method.setAccessible( true );

method.invoke();
sunshine

vlw exatamente o q eu queria!!!

Luca

Olá

Por default, não. Se tentar acessar um membro private, protected ou package-private, receberá uma IllegalAccessException.

Porém, as classes Constructor, Field e Method extendem java.lang.reflect.AccessibleObject que tem o método setAccessible. Se quiser contornar esta limitação, você deve usar setAccessible antes de invocar o método.

Faça um teste.

Para impedir que algum outro desenvolvedor da sua equipe use este método para quebrar o encapsulamento, você precisa de um security.manager.

Coloque no arquivo (C:\Program Files\Java\jre1.6.0\lib\security) java.policy:
permission java.lang.reflect.ReflectPermission supressAccessChecks

Teste executando java -cp . -Djava.security.manager suaClasseComMain

[]s
Luca

Criado 14 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 3
Participantes 3