2009-06-02 28 views
10

Digamos que tengo una referencia a un objeto Class con SomeType que tiene un método estático. ¿Hay alguna manera de llamar a ese método sin instanciar SomeType primero? Preferiblemente, no escapando de la tipificación fuerte.¿Llamando al método estático en una clase?

EDITAR: OK, me equivoqué.

interface Int{ 
    void someMethod(); 
} 

class ImplOne implements Int{ 
    public void someMethod() { 
     // do something 
    } 
} 

Class<? extends Int> getInt(){ 
    return ImplOne.class; 
} 

En este caso, someMethod() no puede ser estático de todos modos.

+0

creo que esta pregunta es realmente acerca de la reflexión de Java, pero en realidad no es clara. –

+0

Hmm, supongo que no. –

Respuesta

24

un método estático, por definición, se llama en una clase y no en una instancia de esa clase.

tanto, si utiliza:

SomeClass.someStaticMethod() 

está instanciar nada (dejar de lado la carga de clases y la creación de instancias de la clase SomeClass en sí, que se encarga de la JVM y está fuera de su alcance).

Esto se opone a un método regular de llamada en un objeto, el cual ya ha sido creada:

SomeObject o = someObject; // had to be instantiated *somewhere* 
o.someMethod(); 
+2

Eclipse (y muy posiblemente otros IDEs) incluso ofrece avisarle si está llamando a un método estático usando sintaxis de instancia ("Acceso no estático al miembro estático", se llama). No es un error, pero es un poco menos claro que usar un acceso explícitamente estático. –

+1

Creo que el propio compilador de Sun también emite esa advertencia ahora. Creo que es lo suficientemente confuso como para que se cometa un error: http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- error-para-la-java-com – Thilo

24

No estoy seguro de cuál es la situación, pero si estás buscando ejecutar el método estático en una clase sin conocer el tipo de clase (es decir, no sabes que es SomeType, solo tienes el objeto Class), si se conoce el nombre y parámetros de método se puede utilizar la reflexión y hace esto:

Class c = getThisClassObjectFromSomewhere(); 

//myStaticMethod takes a Double and String as an argument 
Method m = c.getMethod("myStaticMethod", Double.class, String.class); 
Object result = m.invoke(null, 1.5, "foo"); 
-1

Sí. De eso se tratan los métodos estáticos. Solo llámalo. SomeType.yourStaticMethodHere().

10

Como hablas de un objeto de clase, supongo que estás interesado en la reflexión de Java. He aquí una breve fragmento que hace lo que estamos tratando de hacer:

Class someClass = SomeType.class; 
Method staticMethod = someClass.getMethod("methodName", ...); 

// pass the first arg as null to invoke a static method 
staticMethod.invoke(null, ...); 
Cuestiones relacionadas