Насколько мне известно, всякий раз, когда класс загружается, JVM создает для него объект Class.class, который хранит всю метаинформацию загруженного класса.
Когда мы используем метод forName ("classname"), он сначала загружает "classname", а затем создает для него объект Class.class и возвращает ссылку на созданный объект Class.class.
Example.java задается как:
class Example
{
static
{
System.out.println("Example Loaded");
}
Example()
{
System.out.println("Example Constructed");
}
}
Use.java - это:
import java.lang.reflect.*;
class Use
{
int i;
public static void main(String[] args) throws Exception
{
Class c = Class.forName("Example");
Constructor[] con = c.getDeclaredConstructors();
for(Constructor x: con)
{
System.out.println(x.getName());
}
}
}
Запуск Use.java выводит:
Example Loaded
Example
getClass () - это метод, который можно использовать только с объектами. Так что обязательно перед созданием объекта будет загружен класс и для него будет создан объект Class.class.
Согласно разделу «Класс и данные» в http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html, "Каждый раз, когда мы компилируем любой файл Java, компилятор вставляет общедоступное, статическое, последнее поле с именем class , типа java.lang.Class в передаваемом байтовом коде ". Мы можем использовать это поле как:
import java.lang.reflect.*;
class Use
{
int i;
public static void main(String[] args) throws Exception
{
Class c = Example.class;
Constructor[] con = c.getDeclaredConstructors();
for(Constructor x: con)
{
System.out.println("Hello "+x.getName());
}
}
}
Вывод приведенного выше кода:
Hello Example
Статическое тело примера не выполняется. Означает, что класс Example не загрузился.
Я сомневаюсь:
Если класс не загрузился, то объект Class.class для него также не будет создан. Тогда откуда инструкция «Class c = Example.class» возвращает ссылку на Class.class?
javap -v Example.class
и проверьте#1
в постоянном пуле :) 26.04.2016