Estoy tratando de probar mi código, aunque sabiendo utilizando la reflexión no es una buena manera de prueba. Tengo una clase externa como de clase interna pública y privada con un método público como abajo,
public class Outer {
private class Inner {
private int var = 1;
public Inner(int a) {
System.out.println("___");
}
public void test(int a) {
System.out.println("Hey");
}
}
}
Mis principales miradas de clase Java, como más adelante
main() {
Outer b = new Outer();
System.out.println(b);
Class<?> innerClass = Class.forName("car.Outer$Inner");
Constructor<?> constructor = innerClass.getDeclaredConstructor(Outer.class, 1);
constructor.setAccessible(true);
Object c = constructor.newInstance(b,b);
Method method = c.getClass().getDeclaredMethod("test");
method.setAccessible(true);
method.invoke(c, 1);
}
Este es el lanzamiento
Excepción en el hilo java.lang.NoSuchMethodException "principal": car.Outer $ Inner.test () en java.lang.Class.getDeclaredMethod (Class.java:2130) en car.A.main (A.java:36)
Cómo invocar el método clase interna teniendo parámetro utilizando la reflexión?
Debe suministrar la clase de argumento (s) en la llamada a getDeclaredMethod()
. Cuando se llama getDeclaredMethod()
, el primer argumento es el nombre del método que desea levantó la vista y argumentos restantes son las clases del argumento (s) para el método que desee. Así es como getDeclaredMethod()
se distingue entre nombres de los métodos sobrecargados para obtener un método particular. Puesto que usted ha suministrado sin argumentos adicionales, getDeclaredMethod()
se busca un método llamado test
que no tiene argumentos. Que está recibiendo una excepción porque no tiene tal método en la clase Outer$Inner
. El único test
método que no tiene una toma int
parameter`, por lo que el siguiente debe hacer lo que quiera:
Method method = c.getClass().getDeclaredMethod("test", int.class);
Aquí, int.class
es el Class
objeto correspondiente al tipo de argumento primitiva int
.