2016-12-15 11 views
1

java.lang.Instrumentation.getAllLoadedClasses()というJavaエージェントクラスを作成しました。クラスの配列を取得し、それを使って反復処理を行い、フルネームを出力します。Javaのクラスが自動的にロードされるのはなぜですか?

が、私はこのエージェントを実行するには、このコマンドを使用:

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

<agent_jar>は私のエージェントクラスが含まれている、と私は渡す必要があるため<sample_jar>がちょうど(空のmainメソッドを持つクラスが含まれてい一部クラス/ jaからjavaコマンドへ)

基本的に、JVMによってロードされるすべてのデフォルトクラスが表示されます。名前に「String」と「Object」を含むクラス名のスニペットが表示されます。

(出力形式: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クラスを継承しているため、Javaのすべてのクラスのスーパークラスであるため、ロードする必要があります。

ロードされたクラスをプリントアウトすると、Objectクラスが表示されます。 Oracleのドキュメントから

Objectクラスは、java.langパッケージには、 クラス階層ツリーの最上位に位置しています。すべてのクラスは、直接または間接の子クラスで、Objectクラスの です。使用または書き込みするすべてのクラスは、オブジェクトの インスタンスメソッドを継承します。 hereから

:JVMで

クラスローダー

は、それぞれ、すべてのクラスが はjava.lang.ClassLoaderのいくつかのインスタンスによってロードされます。 ClassLoaderクラスは java.langパッケージにあり、開発者はサブクラス化してクラスローディングに 独自の機能を追加できます。

は、新しいJVMがJava MyMainClassを入力して、起動するたびに、「ブートストラップクラスローダは、」キーのJavaクラスjava.lang.Objectの第1のメモリに他のランタイムコードのような をロードする責任があります。 実行時クラスは、JRE \ lib \ rt.jarファイルの内部にパッケージ化されています。 は、ネイティブの実装であるため、Java のマニュアルでブートストラップクラスローダーの詳細を見つけることができません。同じ の理由で、ブートストラップクラスローダーの動作も、JVM全体で と異なります。

0

なぜ多くのクラスの配列エントリがあるのですか?オブジェクトとオブジェクト[]?

これは、アプリケーション、および/またはJVMのデフォルトのアプリケーションランチャーコードリファレンスのクラスです。

他の他のクラスがそれを継承するため、Objectクラスがロードされます。 Object[]配列タイプは、ランチャーがリフレクションを使用してmain(String[])メソッドのMethodオブジェクトを見つけるときに最もよく使用されます。

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に書き込みます。リストにあるクラスの中には、そのために必要なものがいくつかあると想像するのは難しいことではありません。

関連する問題