私はリフレクションを試して、クラス名を入力できるところに到達できるかどうかを確認しようとしています。アプリケーションがそのクラスをロードしてそのインスタンスを作成します。いくつかの試みの後、私はちょうどそのパッケージ名なしでClass.forName()
にクラス名を張ることができないことが分かったので、ロードされたすべての利用可能なパッケージのリストを取得しようとした。パッケージ名がヒットするまで。私のリフレクションが奇妙なクラスを読み込むのはなぜですか?
これは私がこれまで持っているものである:それは半非常に奇妙な方法で動作します
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String s = "";
do
{
ClassLoader clsldr = ClassLoader.getSystemClassLoader();
Package[] pkgs = Package.getPackages();
s = console.readLine();
if(s.equals(":exit"))
{
System.exit(0);
}
boolean classFound = false;
Object loadedClass = null;
String classname = "";
for (int i = 0; i < pkgs.length; i++) {
Package package1 = pkgs[i];
try
{
classname = package1.getName().replace('/', '.') + "." + s;
clsldr.loadClass(classname);
loadedClass = Class.forName(classname);
classFound = true;
}
catch(Exception e)
{
}
}
System.out.println("LOADED A CLASS!!!!");
System.out.println(classname);
System.out.println(loadedClass);
}
while(s.length() == 0);
。たとえば、プロンプトで「Object」と入力すると、何らかの形でsun.net.util.Object
をロードすることができますが、実際のオブジェクトをプリントアウトすると、class java.lang.Object
が印刷されます。私はString
と私がタイプしたいくつかの他のものと同じことを得る。私が試した興味深いものはint
でした - それはsun.net.util.int
をロードし、私がオブジェクトを印刷したときにnullを返しました。私はJava
をしようとしたときには、別のことが起こっ:
Java
LOADED A CLASS!!!!
sun.net.util.Java
null
誰もがここで何が起こっている任意の手掛かりを持っていますか?この原因となっているsun.net.util
パッケージには特別なものがありますか?私のコードは私が望むように正確に動作しないことに本当に気をつけません、私はちょうどこの奇妙な振る舞いの原因を知りたいです。
Javaバージョン:
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
それはすべての違いを、私は、Windows 8 64ビットによ。
"奇妙な"クラスが最初に現れた場合、そのスキームが失敗することを除いて。またはどちらのクラスも「奇妙」でない場合。例えば'java.util.Date'と' java.sql.Date'です。 –