これで、正規名から完全修飾名(FQN)を取得したいようです。それは単純な名前からの作業とは異なるので、2番目の答えを追加します。
正規の名前の競合が発生した場合、Sunjavacコマンドはクラスをコンパイルしません。ただし、別々にコンパイルすることで、同じ正規名を持つ2つの異なるクラスを取得できます。
例:
ファイルsrc1\com \ stack \ Test.java
package com.stack;
public class Test {
public static class Example {
public static class Cow {
public static class Hoof {
}
}
}
public static void main(String[] args) throws Exception {
Class<?> cl1 = Class.forName("com.stack.Test$Example$Cow$Hoof");
Class<?> cl2 = Class.forName("com.stack.Test.Example.Cow.Hoof");
System.out.println(cl1.getName());
System.out.println(cl1.getSimpleName());
System.out.println(cl1.getCanonicalName());
System.out.println();
System.out.println(cl2.getName());
System.out.println(cl2.getSimpleName());
System.out.println(cl2.getCanonicalName());
}
}
ファイルsrc2\com \ stack \ Test \ Example \ Cow \ Hoof.java
package com.stack.Test.Example.Cow;
public class Hoof { }
次に、コンパイルして実行します。
set CLASSPATH=
mkdir bin1 bin2
javac -d bin1 -sourcepath src1 src1\com\stack\Test.java
javac -d bin2 -sourcepath src2 src2\com\stack\Test\Example\Cow\Hoof.java
set CLASSPATH=bin1;bin2
java com.stack.Test
出力の生成:
com.stack.Test$Example$Cow$Hoof
Hoof
com.stack.Test.Example.Cow.Hoof
com.stack.Test.Example.Cow.Hoof
Hoof
com.stack.Test.Example.Cow.Hoof
したがって、2つのクラスの正規名は同じですが、FQNが異なります。2つのクラスのFQNと正規名が同じであっても、異なるクラスローダーを介してロードされる場合は異なる可能性があります。
あなたの問題を解決するために、私はあなたがとることができるいくつかの方法を見ます。
最初に、ネストの量が最も少なく、したがってFQNの「$」の数が最も少ないクラスと一致するように指定できます。更新Sunjavacはこれとは正反対のことを行い、最もネストされたクラスと一致することがわかりました。
次に、考えられるすべてのFQNをテストし、複数ある場合は例外をスローできます。
第3に、唯一の一意のマッピングはFQNを使用することであり、指定されたクラスローダー内でのみ行われることを受け入れ、アプリケーションを適切に再処理します。スレッドコンテキストクラスローダーをデフォルトのクラスローダーとして使用すると便利だと思います。