с последующей загрузкой класса я был озадачен, так как тип, который был загружен, также изменился, когда я изменил тип статической переменной (что теперь имеет смысл, зная, что есть сгенерированный метод получения и видя собственную трассировку). СПАСИБО

аюсь понять, какие события приводят к загрузке классов, очень детально, и во время моего тестирования обнаружилось одно поведение, которого я не понимаю в этом очень простом примере:

public class ClinitTest {
    public static Integer num;
    public static Long NUMTEST;

    static {
        NUMTEST = new Long(15);;
        num = (int) (NUMTEST * 5);
        System.out.println(num);
    }

    public static void main(String[] args) {
        System.out.println( "The number is " + num);
    }
}

При бегеjava.lang.Long загружается при выполнении<clinit>, Что ж, он загружается ранее загрузчиком классов, но AppClassloader вызывается в этот момент, так как он еще не зарегистрирован как инициирующий загрузчик классов. Таким образом, LauncherHelper получит класс приложения, и прежде чем он сможет вызвать метод main, JVM обеспечит инициализацию класса. Во время исполнения<clinit> происходит загрузка этого класса.

В другом случае я использую Java-агент для переименования<clinit> к чему-то другому и вместо этого добавьте пустой. Я ожидал, что - так как оригинал<clinit> код не выполняется, я бы не получил события загрузки класса.

Странно кажется, что в это время нагрузкаjava.lang.Long происходит гораздо раньше, хотя. В своем следе я вижу, что это срабатывает, когдаLauncherHelper пытается проверить основной класс. Здесь он пытается получить метод main с помощью отражения и вызоваjava.lang.Class.getDeclaredMethods0() под капотом приводит к вызовуAppClassLoader проситьjava.lang.Long.

Итак, вопросы:

Как это возможно, что в обычное время выполнения класс загружается позже (то есть, когда код фактически выполняется), но загружается так рано, когда код фактически никогда не должен выполняться, потому что переименованный клиник никогда не вызывается?

Есть ли способ в JVM отследить, какие события приводят к таким нагрузкам класса? Не только когда это происходит, но на самом деле, какая инструкция или событие приводит к этому, поскольку это может быть вызвано первым использованием класса, проверением другого класса, компиляцией JIT и т. Д.

Ответы на вопрос(1)

Ваш ответ на вопрос