2011-03-05 15 views

Respuesta

28

Sólo es posible acceder a los métodos que utilizan reflexión. No puede hacer referencia a una clase directamente, solo una instancia de tipo Clase.

utilizar la reflexión para invocar methodname (int a, String b):

Method m = clazz.getMethod("methodname", Integer.class, String.class); 
m.invoke(null, 1, "Hello World!"); 

Ver Class.getMethod() y Method.invoke()

Es posible que desee pensar en el diseño de nuevo, para evitar la necesidad de llamar dinámicamente métodos estáticos

5

No se puede acceder a los métodos estáticos y sin una referencia explícita a la clase.

Sin herencia aquí, lo siento, por lo que debe o bien hacer:

A.foo() 

o

B.foo() 

Si realmente lo necesita, usted tendrá que hacer una verificación:

Object o = .... // eith an A or B instance. 
if(o instanceof A) { 
    A.foo() 
} else { 
    B.foo() 
} 

Pero, ¿por qué no simplemente hace esas funciones funciones de instancias y les permite implementar una interfaz?

Okey, tiene un objeto de clase. Después, realice:

Class c = ...; 
c.getMethod("foo").invoke(null); // null to invoke static methods 
+0

pero no clazz tiene una referencia a 'A' o 'B'. ¿Eso significa que no es posible hacer esto? – user339108

+0

@ user339108, lamentablemente no, no en el buen sentido –

+0

Tenía la lógica escrita originalmente para interfaces y mis clases derivadas ('A' o 'B') no se pueden crear instancias ya que se definieron como clases internas y no tenían una identificador de clase pública, por lo tanto tuve que recurrir a esta técnica. – user339108

9

puede invocar un método estático a través de la reflexión de esta manera:

Method method = clazz.getMethod("methodname", argstype); 
Object o = method.invoke(null, args); 

Dónde argstype es una matriz de tipo y argumentos args es un conjunto de parámetros para la llamada. Más información acerca de los siguientes enlaces:

En su caso, algo como esto debería funcionar:

Method method = clazz.getMethod("foo", null); 
method.invoke(null, null); // foo returns nothing 
+1

Puede dejar los últimos 'null's en las últimas dos líneas, ya que esos métodos ahora se declaran como métodos var-args. –

+0

Lo encuentro más claro así, pero es bueno señalarlo. – krtek

0

De acuerdo con mi falta de conocimiento, la necesidad de la construcción solicitada viene dada por el hecho de que una interfaz no ofrece la posibilidad de métodos abstractos estáticos.Aquí está un ejemplo:

public enum Cheese implements Yumy { 
    GOUDA(49), 
    ESROM(40), 
    HWARTI(38); 
    private int percentage; 
    private Cheese(int fat100) {...} constructor 
    public void yamyam() {...} // as in Yumy 
    public static Cheese getByFat(int fat100) {...} // no chance to be part 
                of interface 
}; 
0

espero que esto no es hacer demasiadas suposiciones o desviarse demasiado lejos de su pregunta, pero si sus dos clases comparten un supertipo común y la creación de una instancia es tolerable entonces se puede:

  1. implementar una interfaz común
  2. Crear una instancia del objeto a través de myClass.newInstance() (clase debe tener un constructor vacío)
  3. Call el método estático del objeto de instancia.


interface Foo { 
    void foo(); 
} 
class A implements Foo {...} 
class B implements Foo {...} 

<T extends Foo> public void something(Class<T> clazz) { 
    T myInstance = clazz.newInstance(); 
    myInstance.foo(); 
} 

... 
something(A.class); 

Es un poco extraño, pero en mi caso resultó ser útil, y empecé preguntando a la misma pregunta que usted hizo.

Cuestiones relacionadas