在类上调用静态方法?

yan*_*nko 13 java static-methods class

比如,我有一个带有SomeType的Class对象的引用,它有一个静态方法.有没有办法调用该方法无需首先实例化SomeType?最好不要逃避强打字.

编辑:好的,我搞砸了.

interface Int{
    void someMethod();
}

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

Class<? extends Int> getInt(){
    return ImplOne.class;
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ley 34

我不确定情况究竟是什么,但是如果你想在不知道类类型的情况下在类上执行静态方法(即你不知道它是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");
Run Code Online (Sandbox Code Playgroud)


Yuv*_*dam 24

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

所以如果你使用:

SomeClass.someStaticMethod()
Run Code Online (Sandbox Code Playgroud)

你实际上没有实例化(抛开SomeClass类本身的类加载和实例化,JVM处理它并超出你的范围).

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

SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
Run Code Online (Sandbox Code Playgroud)

  • Eclipse(很可能是其他IDE)甚至提供警告你,如果你使用实例语法调用静态方法("非静态访问静态成员",它被调用).这不是一个错误,但它比使用显式静态访问要简单一点. (2认同)

JSB*_*ոգչ 12

既然你谈到了一个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, ... );
Run Code Online (Sandbox Code Playgroud)