18

说,我有一个类对象的引用,其中 SomeType 有一个静态方法。有没有办法在不先实例化 SomeType 的情况下调用该方法?最好不要逃避强类型。

编辑:好的,我搞砸了。

interface Int{
    void someMethod();
}

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

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

在这种情况下 someMethod() 无论如何都不能是静态的。

4

4 回答 4

39

我不确定具体是什么情况,但是如果您希望在不知道类类型的情况下对类执行静态方法(即您不知道它是 SomeType,您只有 Class 对象),如果您知道可以使用反射的方法的名称和参数并执行以下操作:

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");
于 2009-06-02T22:54:57.250 回答
30

根据定义,静态方法在类上调用,而不是在该类的实例上调用。

因此,如果您使用:

SomeClass.someStaticMethod()

您什么都没有实例化(撇开SomeClass类本身的类加载和实例化,JVM 处理这些并且超出了您的范围)。

这与在已经实例化的对象上调用的常规方法相反:

SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
于 2009-06-02T22:56:20.413 回答
14

由于您谈论的是 Class 对象,我假设您对 Java 反射感兴趣。这是一个简短的片段,可以做你想做的事情:

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

// pass the first arg as null to invoke a static method
staticMethod.invoke( null, ... );
于 2009-06-02T23:07:28.847 回答
0

是的。这就是静态方法的全部意义所在。就叫吧。SomeType.yourStaticMethodHere()。

于 2009-06-02T22:57:45.093 回答