Tengo una clase que usa XML y reflexión para devolver Object
s a otra clase.
Normalmente estos objetos son subcampos de un objeto externo, pero ocasionalmente es algo que quiero generar sobre la marcha. He intentado algo como esto pero fue en vano. Creo que es porque Java no le permitirá acceder a private
métodos de reflexión.
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);
Si el método proporcionado es private
, falla con a NoSuchMethodException
. Podría resolverlo haciendo el método public
, o haciendo otra clase para derivarlo.
En pocas palabras, me preguntaba si había una manera de acceder a un private
método a través de la reflexión.
fuente
getDeclaredMethod()
lugar de sologetMethod()
: esto no funcionará para métodos privados.private
acceso jugando un papel similar.Use
getDeclaredMethod()
para obtener un objeto Método privado y luego usemethod.setAccessible()
para permitir llamarlo realmente.fuente
java.lang.StackOverflowError
si no llamosetAccessible(true)
.Si el método acepta un tipo de datos no primitivo, se puede utilizar el siguiente método para invocar un método privado de cualquier clase:
Los parámetros aceptados son obj, methodName y los parámetros. Por ejemplo
El método concatString se puede invocar como
fuente
puede hacerlo utilizando ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils )
Ejemplo: si tienes una clase con un método privado
square(int x)
fuente
Permítanme proporcionar un código completo para la ejecución de métodos protegidos a través de la reflexión. Admite cualquier tipo de parámetros, incluidos genéricos, parámetros autoboxed y valores nulos
El método usa Apache ClassUtils para verificar la compatibilidad de los parámetros autoboxed
fuente
Una variante más es usar la biblioteca JOOR muy poderosa https://github.com/jOOQ/jOOR
Permite modificar cualquier campo como las constantes estáticas finales y llamar a métodos protegidos y sin especificar una clase concreta en la jerarquía de herencia
fuente
Puede utilizar Manifold's @Jailbreak para una reflexión Java directa y segura de tipos:
@Jailbreak
desbloquea lafoo
variable local en el compilador para acceder directamente a todos los miembros deFoo
la jerarquía.Del mismo modo, puede usar el método de extensión jailbreak () para un uso único:
A través del
jailbreak()
método, puede acceder a cualquier miembro deFoo
la jerarquía.En ambos casos, el compilador resuelve la llamada al método para que escriba con seguridad, como si fuera un método público, mientras que Manifold genera un código de reflexión eficiente para usted bajo el capó.
Alternativamente, si el tipo no se conoce estáticamente, puede usar la tipificación estructural para definir una interfaz que un tipo puede satisfacer sin tener que declarar su implementación. Esta estrategia mantiene la seguridad de tipos y evita problemas de rendimiento e identidad asociados con la reflexión y el código proxy.
Descubre más sobre Colector .
fuente