Вызов статического метода для класса? - PullRequest
12 голосов
/ 03 июня 2009

Скажем, у меня есть ссылка на объект Class с SomeType, имеющий статический метод. Есть ли способ вызвать этот метод без создания экземпляра SomeType первым? Желательно не избегать строгой типизации.

РЕДАКТИРОВАТЬ: ОК, я облажался.

interface Int{
    void someMethod();
}

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

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

В этом случае someMethod () в любом случае не может быть статическим.

Ответы [ 4 ]

30 голосов
/ 03 июня 2009

Я не совсем уверен, какова ситуация, но если вы хотите выполнить статический метод для класса, не зная тип класса (то есть вы не знаете, что это 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");
24 голосов
/ 03 июня 2009

Статический метод по определению вызывается для класса, а не для экземпляра этого класса.

Так что если вы используете:

SomeClass.someStaticMethod()

вы ничего не создаете (оставьте в стороне загрузку класса и создание экземпляра самого класса SomeClass, который обрабатывается JVM и выходит за рамки вашей области).

Это противоположно обычному методу, вызываемому для объекта, который уже был создан:

SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
12 голосов
/ 03 июня 2009

Поскольку вы говорите об объекте 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, ... );
0 голосов
/ 03 июня 2009

Да. Вот что такое статические методы. Просто позвони. SomeType.yourStaticMethodHere ().

...