私はJavaリフレクションを使用して実行しようとしていますClass c = Class.forName(className)
文字列には複数のサブパッケージからのクラスが含まclassName
れるため、パッケージ名を指定せずに渡したいと思います。className
com.A.*
com.B.*
com.Z.*
出来ますか?
この場合、多くのサブパッケージがある場合、異なるサブパッケージをプリペンディングするためにケースを切り替えることはできません。
私はJavaリフレクションを使用して実行しようとしていますClass c = Class.forName(className)
文字列には複数のサブパッケージからのクラスが含まclassName
れるため、パッケージ名を指定せずに渡したいと思います。className
com.A.*
com.B.*
com.Z.*
出来ますか?
この場合、多くのサブパッケージがある場合、異なるサブパッケージをプリペンディングするためにケースを切り替えることはできません。
簡単なオプションの1つは、候補パッケージのリストを用意することです。
for (String pkg : packages) {
String fullyQualified = pkg + "." + className;
try {
return Class.forName(fullyQualified);
} catch (ClassNotFoundException e) {
// Oops. Try again with the next package
}
}
確かに、これは世界で最も優れたコードではありません...
クラスが見つからない場合に例外をスローしない代替呼び出し(例)を探すことで、より高速にできる場合があります。ClassLoader.getResource
名前をまったく指定せずにクラスを見つけられるようにするために、私が知っていることは確かにありません。
まず、Reflectionsライブラリですべてのクラスを取得します
Reflections reflections = new Reflections();
Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class);
次に、ルックアップマップを作成します。
// Doesn't handle collisions (you might want to use a multimap such as http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html instead)
Map<String, Class<?>> classBySimpleName = new HashMap<>();
for(Class<?> c : allClasses) {
classBySimpleName.put(c.getSimpleName(), c);
}
クラスを検索する必要がある場合は、次のようにします。
Class<?> clazz = classBySimpleName.get(className);
java.lang.Classのjavadocからは不可能です
public static Class<?> forName(String className)
throws ClassNotFoundException
Parameters:
className - the fully qualified name of the desired class.
Returns:
the Class object for the class with the specified name.