usar sirve restricción que para métodos metodos metodo llamar estáticos estaticos estatico definicion cuando como clase atributos java static-methods

sirve - ¿Cómo llamar a getClass() desde un método estático en Java?



public static java (8)

Tengo una clase que debe tener algunos métodos estáticos. Dentro de estos métodos estáticos, necesito llamar al método getClass () para hacer la siguiente llamada:

public static void startMusic() { URL songPath = getClass().getClassLoader().getResource("background.midi"); }

Sin embargo Eclipse me dice:

Cannot make a static reference to the non-static method getClass() from the type Object

¿Cuál es la forma adecuada de corregir este error de tiempo de compilación?


En Java7 + puedes hacer esto en métodos / campos estáticos:

MethodHandles.lookup().lookupClass()


En cuanto al ejemplo de código en la pregunta, la solución estándar es hacer referencia a la clase explícitamente por su nombre, e incluso es posible hacerlo sin la llamada a getClassLoader() :

class MyClass { public static void startMusic() { URL songPath = MyClass.class.getResource("background.midi"); } }

Este enfoque aún tiene un lado reverso que no es muy seguro contra los errores de copiar / pegar en caso de que necesite replicar este código en una cantidad de clases similares.

Y en cuanto a la pregunta exacta en el titular, hay un truco publicado en el hilo adyacente :

Class currentClass = new Object() { }.getClass().getEnclosingClass();

Utiliza una subclase de Object anónima anidada para controlar el contexto de ejecución. Este truco tiene la ventaja de ser seguro copiar y pegar ...

Precaución al usar esto en una clase base que otras clases heredan de:

También vale la pena señalar que si este fragmento de código tiene la forma de un método estático de alguna clase base, el valor de currentClass siempre será una referencia a esa clase base en lugar de a cualquier subclase que pueda estar usando ese método.


Intenta algo como esto. Esto funciona para mi. Logg (nombre de la clase)

String level= ""; Properties prop = new Properties(); InputStream in = Logg.class.getResourceAsStream("resources//config"); if (in != null) { prop.load(in); } else { throw new FileNotFoundException("property file ''" + in + "'' not found in the classpath"); } level = prop.getProperty("Level");


Intentalo

Thread.currentThread().getStackTrace()[1].getClassName()

O

Thread.currentThread().getStackTrace()[2].getClassName()


Luché con esto yo mismo. Un buen truco es usar el hilo actual para obtener un ClassLoader en un contexto estático. Esto funcionará también en una Reducción de Mapa de Hadoop. Otros métodos funcionan cuando se ejecutan localmente, pero devuelven un InputStream nulo cuando se usan en un MapReduce.

public static InputStream getResource(String resource) throws Exception { ClassLoader cl = Thread.currentThread().getContextClassLoader(); InputStream is = cl.getResourceAsStream(resource); return is; }


Simplemente use TheClassName.class lugar de getClass() .


Simplemente use un literal de clase, es decir, NameOfClass.class


getClass() método getClass() se define en la clase de objeto con la siguiente firma:

Clase final pública getClass ()

Como no está definido como static , no puede llamarlo dentro de un bloque de código estático. Consulte estas respuestas para obtener más información: Q1 , Q2 , Q3 .

Si estás en un contexto estático, entonces tienes que usar la expresión literal de la clase para obtener la Clase, así que básicamente debes hacer lo siguiente:

Clase de foo

Este tipo de expresión se denomina Class Literals y se explican en el Libro de especificaciones del lenguaje Java de la siguiente manera:

Un literal de clase es una expresión que consiste en el nombre de una clase, interfaz, matriz o tipo primitivo seguido de un ''.'' y la clase token. El tipo de un literal de clase es Class. Se evalúa en el objeto Clase para el tipo nombrado (o para el vacío) como lo define el cargador de clases definitorias de la clase de la instancia actual.

También puede encontrar información sobre este tema en la documentación de la API para la clase.