Java 如何使用反射提取特定类型的所有属性?
我有许多类,它们可以包含类型为Java 如何使用反射提取特定类型的所有属性?,java,reflection,Java,Reflection,我有许多类,它们可以包含类型为translateabletext的一个或多个属性。此外,某些类可能具有自身包含此类属性的属性,例如List或Map 如何高效地扫描这些类,同时在泛型集合中选择translateabletext的实例 class Project{ String id; TranslatableText name; List<Action> actions; } class Action { String id; Translat
translateabletext
的一个或多个属性。此外,某些类可能具有自身包含此类属性的属性,例如List
或Map
如何高效地扫描这些类,同时在泛型集合中选择translateabletext
的实例
class Project{
String id;
TranslatableText name;
List<Action> actions;
}
class Action {
String id;
TranslatableText name;
TranslatableText description;
}
// getter & setters omitted
类项目{
字符串id;
可翻译文本名称;
列出行动;
}
集体诉讼{
字符串id;
可翻译文本名称;
可译文本描述;
}
//省略getter和setter
您可以使用这样的循环
// for super classes, use recursion.
for(Field f : obj.getClass().getDeclaredFields()) {
Class type = f.getType();
if (type == String.class || type == TranslatableText.class) {
Object value = f.get(object);
if (value != null)
map.put(f.getName(), value.toString());
}
感谢Peter Lawrey提出了最初的想法。这就是(到目前为止)对我起作用的原因。我必须避免循环递归,这就是为什么我添加了
visted
列表<代码>阵列,集合
和地图
都经过扫描,目前对我来说已经足够好了
/**
* Examine class members for TranslatableTexts. Traverse down into
* properties including Collections and Maps but ignoring java.lang classes
*
* @param obj
* @return
*/
public static Collection<? extends TranslatableText> getTranslatables(
Object obj, List<Object> visited)
{
List<TranslatableText> result = new ArrayList<TranslatableText>();
if (obj instanceof TranslatableText)
{
result.add((TranslatableText) obj);
return result;
}
if(visited.contains(obj))
return result;
visited.add(obj);
for (Field f : obj.getClass().getDeclaredFields())
{
f.setAccessible(true);
Class type = f.getType();
if (type.isPrimitive() == false
&& (type.getPackage() == null || type.getPackage()
.getName().startsWith("java.lang") == false))
{
try
{
Object value = f.get(obj);
if (value != null)
{
if (type.isArray())
{
Class arraytype = type.getComponentType();
if (arraytype == TranslatableText.class)
{
TranslatableText[] tt = (TranslatableText[]) value;
if (tt != null)
{
for (TranslatableText t : tt)
{
result.add(t);
}
}
}
}
else if (type == TranslatableText.class)
{
TranslatableText tt = (TranslatableText) value;
if (tt != null)
result.add(tt);
}
else if (value instanceof Collection)
{
for (Object o : (Collection<?>) value)
{
result.addAll(getTranslatables(o, visited));
}
}
else if (value instanceof Map)
{
for (Object o : ((Map) value).values())
{
result.addAll(getTranslatables(o, visited));
}
}
else
{
result.addAll(getTranslatables(value, visited));
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
return result;
}
/**
*检查班级成员的可翻译文本。横穿到
*属性,包括集合和映射,但忽略java.lang类
*
*@param obj
*@返回
*/
公共静态集合