2016-12-15 2 views
1

Я создал класс агента java, который просто использует java.lang.Instrumentation.getAllLoadedClasses() для извлечения массива классов, по которым я повторяю и печатаю их полные имена.Почему массив классов загружается автоматически в Java?

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

java -javaagent:<agent_jar> -jar <sample_jar>

<agent_jar> содержит мой класс агента и <sample_jar> содержит только класс с пустым основным методом (так как я должен пройти некоторые класс/jar к команде java)

Итак, в основном, он печатал все классы по умолчанию, загружаемые JVM, и вот фрагмент для имен классов, содержащих «имена» и «объект» в их именах:

(Выходной формат: Class.getName() - Class.getTypeName())

java.util.Objects - java.util.Objects 
[Ljava.lang.String; - java.lang.String[] 
java.lang.String$CaseInsensitiveComparator - java.lang.String$CaseInsensitiveComparator 
[Ljava.io.ObjectStreamField; - java.io.ObjectStreamField[] 
java.io.ObjectStreamField - java.io.ObjectStreamField 
[Ljava.lang.Object; - java.lang.Object[] 
java.lang.StringBuilder - java.lang.StringBuilder 
java.lang.StringBuffer - java.lang.StringBuffer 
java.lang.AbstractStringBuilder - java.lang.AbstractStringBuilder 
java.lang.reflect.AccessibleObject - java.lang.reflect.AccessibleObject 
java.lang.String - java.lang.String 
java.lang.Object - java.lang.Object 

Почему существует массив вхождений для многих классов, например. Объект и объект []?

+0

Ссылка http://stackoverflow.com/questions/3442090/java-what-is-this-ljava-lang-object – Guy

+0

Просто потому, что ваш 'main' пуст, это не значит, что JVM ничего не делает * ничего *. Очевидно, что нужно загружать некоторые вещи, чтобы иметь возможность загружать ваш класс и запускать основной метод. – Tom

ответ

0

Он должен быть загружен, потому что каждый класс в Java расширяет класс Object или мы можем сказать, что Object является суперклассом каждого класса в Java.

Поэтому, когда вы печатаете загруженные классы, он отображает класс Object.

От Oracle Docs:

Класс объекта, в пакете java.lang, сидит на вершине дерева иерархии класса. Каждый класс является потомком, прямым или косвенным, класса Object. Каждый класс, который вы используете или записываете, наследует методы экземпляра объекта.

От here:

Класс погрузчики

В JVM, каждый класс загружается некоторым экземпляром java.lang.ClassLoader. Класс ClassLoader находится в пакете java.lang , и разработчики могут подклассифицировать его, чтобы добавить свои собственные функции в загрузку классов.

Всякий раз, когда новая JVM запускается командой Java MyMainClass, то «самозагрузки загрузчик классов» отвечает за загрузку ключевых Java классов как java.lang.Object и другого кода во время выполнения в память первого. Классы среды выполнения упакованы внутри файла JRE \ lib \ rt.jar. We не может найти информацию о загрузчике класса загрузки в документации Java , так как это естественная реализация. Для той же причины поведение загрузчика класса загрузки также будет отличаться от через JVM.

0

Почему существуют записи массива для многих классов, например. Объект и объект []?

Это просто классы, которые вы применяете, и/или ссылку на код запуска приложения JVM по умолчанию.

Класс Object будет загружен, потому что другие другие классы наследуют его. Тип массива Object[] наиболее вероятно используется, когда пусковая установка использует отражение для поиска объекта Method для метода main(String[]).

Существует куча «черной магии», которая происходит за кулисами, когда JVM загружается сама. Если вам действительно необходимо знать, то исходный код доступен.

(Также возможно, что классы и зависимости вашего агента будут отображаться в списке, но они также могут быть загружены отдельными Загрузчик классов.)

0

Если вы звоните main(String[] args) вам нужно Object (потому что все проходит Object), String[] и String уже.

Теперь см на импорте String, вы узнаете несколько:

import java.io.ObjectStreamField; 
import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.Formatter; 
import java.util.Locale; 
import java.util.Objects; 
import java.util.StringJoiner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.util.regex.PatternSyntaxException; 

Классы не загружаются сразу только потому, что они импортируются. Но когда вы вызываете метод main, JVM выполняет некоторую обработку до, например, разбор параметров и их запись в массив args. Нетрудно представить, что для этого нужны некоторые из перечисленных вами классов.

Смежные вопросы