方法Class.getDeclaredFields
將讓你代表類的每個字段Field
秒的陣列。您可以遍歷這些並檢查Field.getType
返回的類型。將List
類型的字段過濾爲List<String>
會更棘手 - 請參閱this post獲取幫助。
完成所需字段的第一個動態查找後,應該跟蹤(記憶)相關的Field
對象以獲得更好的性能。
這裏有一個簡單的例子:
//for each field declared in User,
for (Field field : User.class.getDeclaredFields()) {
//get the static type of the field
Class<?> fieldType = field.getType();
//if it's String,
if (fieldType == String.class) {
// save/use field
}
//if it's String[],
else if (fieldType == String[].class) {
// save/use field
}
//if it's List or a subtype of List,
else if (List.class.isAssignableFrom(fieldType)) {
//get the type as generic
ParameterizedType fieldGenericType =
(ParameterizedType)field.getGenericType();
//get it's first type parameter
Class<?> fieldTypeParameterType =
(Class<?>)fieldGenericType.getActualTypeArguments()[0];
//if the type parameter is String,
if (fieldTypeParameterType == String.class) {
// save/use field
}
}
}
請注意,我用的參考平等(==
),而不是isAssignableFrom
匹配String.class
和String[].class
因爲String
是final
。
編輯:只是注意到你的一點關於尋找嵌套s。您可以將遞歸應用於上述策略以搜索這些策略。
「我確定我可能不是第一個需要此功能的人嗎?」 ...我確信我不是第一個問你是否真的需要這個功能的人。 「因此,人們經常使用反思去做**,而不應該反思性地做。 –