無関係な一連のクラスがあります。各クラスには、任意のタイプの @PrimaryKey (ゲッターとセッターを使用) を持つ 1 つのプロパティがあります。リフレクションを使用して、任意のクラスのインスタンスのどのプロパティに @PrimaryKey アノテーションが付いているかを見つけるにはどうすればよいですか? その値を文字列として取得できます。
コードは、渡されるクラスのタイプを認識していません。タイプは「オブジェクト」になります。
無関係な一連のクラスがあります。各クラスには、任意のタイプの @PrimaryKey (ゲッターとセッターを使用) を持つ 1 つのプロパティがあります。リフレクションを使用して、任意のクラスのインスタンスのどのプロパティに @PrimaryKey アノテーションが付いているかを見つけるにはどうすればよいですか? その値を文字列として取得できます。
コードは、渡されるクラスのタイプを認識していません。タイプは「オブジェクト」になります。
次のようなことができます。
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()
問題が発生した場合は、いつでも公式ドキュメントを確認できます。私はそれがかなり良いと信じています。
クラスのすべてのフィールドを取得してから、注釈が含まれるフィールドを反復して見つけることができます。
Field[] fields = YourClass.class.getDeclaredFields();
for (Field field : fields) {
Annotation annot = field.getAnnotation(PrimaryKey.class);
if (annot != null) {
System.out.println("Found! " + field);
}
}
まず、メンバーにアノテーションを持つ可能性のあるすべてのクラスを見つける必要があります。これは、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);
}
}
}