3

私はJavaリフレクションを使用して実行しようとしていますClass c = Class.forName(className)

文字列には複数のサブパッケージからのクラスが含まclassNameれるため、パッケージ名を指定せずに渡したいと思います。classNamecom.A.*com.B.*com.Z.*

出来ますか?

この場合、多くのサブパッケージがある場合、異なるサブパッケージをプリペンディングするためにケースを切り替えることはできません。

4

3 に答える 3

9

簡単なオプションの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

名前をまったく指定せずにクラスを見つけられるようにするために、私が知っていることは確かにありません。

于 2012-08-13T07:21:25.970 に答える
5

まず、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);
于 2012-08-13T07:44:50.430 に答える
0

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.
于 2012-08-13T07:21:08.547 に答える