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
*@返回
*/
公共静态集合