0

無関係な一連のクラスがあります。各クラスには、任意のタイプの @PrimaryKey (ゲッターとセッターを使用) を持つ 1 つのプロパティがあります。リフレクションを使用して、任意のクラスのインスタンスのどのプロパティに @PrimaryKey アノテーションが付いているかを見つけるにはどうすればよいですか? その値を文字列として取得できます。

コードは、渡されるクラスのタイプを認識していません。タイプは「オブジェクト」になります。

4

3 に答える 3

2

次のようなことができます。

for (Field field : YourClass.class.getDeclaredFields()) {
    try {
        Annotation annotation = field.getAnnotation(PrimaryKey.class);
        // what you want to do with the field
    } catch (NoSuchFieldException e) {
        // ...
    }
}

クラスのインスタンスを操作している場合は、これを実行してそのclassオブジェクトを取得できます。

Class<?> clazz = instance.getClass();

したがって、最初の行は次のようになります。

instance.getClass().getDeclaredFields()

問題が発生した場合は、いつでも公式ドキュメントを確認できます。私はそれがかなり良いと信じています。

于 2012-12-20T12:51:37.620 に答える
2

クラスのすべてのフィールドを取得してから、注釈が含まれるフィールドを反復して見つけることができます。

Field[] fields = YourClass.class.getDeclaredFields();
for (Field field : fields) {
    Annotation annot = field.getAnnotation(PrimaryKey.class);  
    if (annot != null) {
        System.out.println("Found! " + field);
    }
}
于 2012-12-20T12:52:03.163 に答える
-1

まず、メンバーにアノテーションを持つ可能性のあるすべてのクラスを見つける必要があります。これは、Spring Framework を使用して実現できますClassUtils

    public static void traverse(String classSearchPattern, TypeFilter typeFilter) {
    ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
    ResourcePatternResolver resourceResolver = new    PathMatchingResourcePatternResolver(classLoader);

    Resource[] resources = null;
    try {
        resources = resourceResolver.getResources(classSearchPattern);
    } catch (IOException e) {
        throw new FindException(
                "An I/O problem occurs when trying to resolve resources matching the pattern: "
                        + classSearchPattern, e);
    }

    MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory();

    for (Resource resource : resources) {
        try {
            MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);

            if (typeFilter.match(metadataReader, metadataReaderFactory)) {
                String className = metadataReader.getClassMetadata().getClassName();
                Class<?> annotatedClass = classLoader.loadClass(className);

        // CHECK IF THE CLASS HAS PROPERLY ANNOTATED FIELDS AND 
        // DO SOMETHING WITH THE CLASS FOUND... E.G., PUT IT IN SOME REGISTRY 

            }
        } catch (Exception e) {
            throw new FindException("Failed to analyze annotation for resource: " + resource, e);
        }
    }
}
于 2012-12-20T13:00:13.090 に答える