Pergunta

Say, eu tenho uma referência a um objeto de classe com SomeType ter um método estático. Existe uma maneira de chamar esse método w / o instantiating SomeType primeiro? De preferência, não escapando tipagem forte.

EDIT: Ok., Eu estraguei tudo

interface Int{
    void someMethod();
}

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

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

Neste caso someMethod () não pode ser estática de qualquer maneira.

Foi útil?

Solução

Um método estático, por definição, é chamado em uma classe e não em uma instância dessa classe.

Então, se você usar:

SomeClass.someStaticMethod()

você está instanciar nada (deixar de lado o carregamento de classe e instanciação da própria classe SomeClass, que as alças de JVM e é maneira fora de seu escopo).

Isto é o oposto a um método regular chamado em um objeto, que já foi instanciado:

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

Outras dicas

Eu não sei exatamente qual é a situação, mas se você estiver olhando para executar o método estático em uma classe sem saber o tipo de classe (ou seja, você não sabe que é SomeType, você só tem o objeto de classe) , se você sabe o nome e os parâmetros do método que você pode usar a reflexão e fazer isso:

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");

Uma vez que você fala sobre um objeto de classe, presumo que você estiver interessado em reflexão Java. Aqui está um breve trecho que faz o que você está tentando fazer:

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

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

Sim. Isso é o que métodos estáticos são tudo. Basta ligar para ele. SomeType.yourStaticMethodHere ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top