Eu tenho uma classe que usa XML e reflexão para retornar Object
s para outra classe.
Normalmente, esses objetos são subcampos de um objeto externo, mas, ocasionalmente, é algo que eu quero gerar rapidamente. Eu tentei algo assim, mas sem sucesso. Acredito que é porque o Java não permitirá que você acesse private
métodos de reflexão.
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
Se o método fornecido for private
, ele falhará com a NoSuchMethodException
. Eu poderia resolvê-lo criando o método public
ou criando outra classe para derivá-lo.
Para encurtar a história, eu queria saber se havia uma maneira de acessar um private
método via reflexão.
fonte
getDeclaredMethod()
vez de apenasgetMethod()
- isso não funcionará para métodos particulares.private
acessar desempenhando um papel semelhante.Use
getDeclaredMethod()
para obter um objeto Method privado e, em seguida, usemethod.setAccessible()
para permitir chamá-lo realmente.fonte
java.lang.StackOverflowError
se eu não ligarsetAccessible(true)
.Se o método aceitar um tipo de dados não primitivo, o método a seguir poderá ser usado para chamar um método privado de qualquer classe:
O Parâmetro aceito é obj, methodName e os parâmetros. Por exemplo
O método concatString pode ser chamado como
fonte
você pode fazer isso usando ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils )
Exemplo: se você tem uma classe com um método privado
square(int x)
fonte
Deixe-me fornecer um código completo para execução de métodos protegidos via reflexão. Ele suporta todos os tipos de parâmetros, incluindo genéricos, parâmetros de caixa automática e valores nulos
O método usa o apache ClassUtils para verificar a compatibilidade de parâmetros automáticos.
fonte
Mais uma variante está usando a biblioteca JOOR muito poderosa https://github.com/jOOQ/jOOR
Permite modificar todos os campos, como constantes estáticas finais, e chamar métodos protegidos yne sem especificar classe concreta na hierarquia de herança
fonte
Você pode usar o @Jailbreak do Manifold para refletir Java diretamente com segurança de tipo:
@Jailbreak
desbloqueia afoo
variável local no compilador para acesso direto a todos os membros naFoo
hierarquia.Da mesma forma, você pode usar o método de extensão jailbreak () para uso único:
Através do
jailbreak()
método, você pode acessar qualquer membro daFoo
hierarquia.Nos dois casos, o compilador resolve a chamada do método para você digitar com segurança, como se fosse um método público, enquanto o Manifold gera um código de reflexão eficiente para você.
Como alternativa, se o tipo não for conhecido estaticamente, você poderá usar a Tipagem Estrutural para definir uma interface que um tipo possa satisfazer sem precisar declarar sua implementação. Essa estratégia mantém a segurança de tipo e evita problemas de desempenho e identidade associados ao código de reflexão e proxy.
Descubra mais sobre o coletor .
fonte