使用反射

时间:2017-01-14 22:09:40

标签: java generics reflection

假设以下数据模型:

public Test extends CanDeserialize {
   private List<String> userRoles; 
   ...
} 

当需要手动反序列化对象并且必须为userRole实例化对象时,会发生以下问题:

  1. 调用List<String>方法时,Java反射会将List识别为.GetType()
  2. 调用.GetGenericType()方法时,无法实例化T的实际类型,因为该方法不为此提供任何功能。
  3. <>内部提取类型并通过Class.fromClass(...)实例化可能会导致问题,因为泛型类型可能非常复杂,例如Pair<Pair<String,int>, Pair<String,int>>
  4. 假设反​​序列化发生在类内部,如下所示:

    public abstract CanDeserialize{
        public void deserialize(String object){
            Field[] fields = this.getClass().getDeclaredFields();
        } 
    

    如何实例化userRoles ??

    的对象

1 个答案:

答案 0 :(得分:1)

在Java中,您可以执行以下操作:

List list = new ArrayList();
list.add("Some Values");

现在假设您有List<String>,您可以通过获取字段(就像您所做的那样)使用反射来设置值,然后

fields[0].set(this, list); // in your example there's 1 field only, so the index is 0.

这是有效的,因为在Java中,任何泛型最终都会导致Object类型。是的,这意味着你不需要反思来初始化它。