2009-06-02 2 views
10

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

EDIT: Хорошо, я испортил.

interface Int{ 
    void someMethod(); 
} 

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

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

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

+0

Я думаю, что этот вопрос на самом деле касается отражения Java, но на самом деле это не ясно. –

+0

Хм, я думаю, нет. –

ответ

24

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

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

SomeClass.someStaticMethod() 

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

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

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

Eclipse (и, возможно, другие IDE) даже предлагает предупредить вас, если вы вызываете статический метод с использованием синтаксиса экземпляра («Нестатический доступ к статическому члену», он называется). Это не ошибка, но она немного менее понятна, чем использование явно статического доступа. –

+1

Я думаю, что сам компилятор Sun тоже предупреждает об этом. Я считаю, что достаточно сложно ввести в заблуждение, что должна быть сделана ошибка: http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- ошибка-для-ява-ком – Thilo

24

Я не уверен, что это такое, но если вы хотите выполнить статический метод в классе, не зная тип класса (т. Е. Вы не знаете, что это SomeType, у вас есть объект класса), если вы знаете имя и параметры метода можно использовать отражение и сделать это:

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

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

10

Поскольку вы говорите о объекте 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, ...); 
Смежные вопросы