Embora normalmente pensemos que é viável acessar campos privados e métodos privados de outras classes através do mecanismo de reflexão do JAVA, não é tão difícil.
Nota: Este código só funcionará se você executá-lo em um programa JAVA separado, como você faz alguns testes de unidade ou um programa normal. Se você tentar usar este método dentro de um APPLET JAVA, será necessário modificar ligeiramente o SecurityManager. No entanto, como muitas vezes você não precisa lidar com isso, não entrarei em detalhes aqui.
Aqui está uma lista deste conteúdo:
1. Acesse os campos privados.
2. Acesse métodos privados.
Acesse campos privados:
Para acessar campos privados, você precisa chamar o método Class.getDeclaredField(String name) ou Class.getDeclaredFields(). Os métodos Class.getField(String name) e Class.getFields() retornam apenas campos comuns, portanto não têm efeito. Aqui está um exemplo de uma classe contendo campos privados, e abaixo da classe está o código que acessa os campos privados por meio de reflexão.
Copie o código do código da seguinte forma:
classe pública ObjetoPrivado {
private String privateString = null; //Declarado como um campo privado
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}
Copie o código do código da seguinte forma:
PrivateObject privateObject = new PrivateObject("O Valor Privado"); //instancia o objeto
Campo privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//Permitir acesso a campos privados
String fieldValue = (String) privateStringField.get(privateObject); //Obtém o valor do campo privado
System.out.println("fieldValue = " + fieldValue);
Este código irá imprimir o texto "fieldValue = The Private Value", que é o valor do campo privado privateString do objeto PrivateObject.
Observe que usamos o método PrivateObject.class.getDeclaredfield("privateString"). É esta chamada a este método que retorna o campo privado. Este método retorna apenas campos baseados na classe especificada e não retornará campos declarados pela classe pai.
Observe também com atenção as declarações em negrito. Ao chamar Field.setAccessible(true), você desativa a verificação de acesso para esta instância de campo especificada, que só é eficaz para reflexão. Agora você pode acessá-lo, seja ele privado, protegido ou padrão, mesmo que o chamador não esteja nesse escopo. Você ainda não pode acessar o campo através de métodos regulares porque o compilador não permite isso.
Acessando métodos privados <BR>Para acessar um método privado, você precisa chamar o método Class.getDeclaredMethod(String name,Class[] parâmetroTypes) ou Class.getDeclaredMethods(). Os métodos Class.getMethod(String name,Class[] parâmetroTypes) e Class.getMethods() retornam apenas métodos públicos, portanto, não desempenharão nenhuma função. Abaixo está um exemplo simples de uma classe com métodos privados. Abaixo da classe está o código que acessa os métodos privados por meio de reflexão.
Copie o código do código da seguinte forma:
classe pública ObjetoPrivado {
String privadaString privada = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
string privada getPrivateString(){//método privado
retorne esta.privateString;
}
}
Copie o código do código da seguinte forma:
PrivateObject privateObject = new PrivateObject("O Valor Privado");
Método privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
String returnValue = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
Este exemplo de código imprime o texto "returnValue = The private Value", que é o valor de retorno do método privado.