2013-09-13 4 views
4

Я хочу установить свойство класса с помощью отражения, а мой класс имеет свойство List<Article>.Как создать экземпляр java.lang.reflect.Type

Я просто получить тип дженериков в List<Article> по ниже кода

Method[] methods = target.getClass().getMethods(); 
String key = k.toString(), methodName = "set" + key; 
Method method = getMethod(methods, methodName); 
if (Iterable.class.isAssignableFrom(method.getParameterTypes()[0])) { 
    // at there, i get the generics type of list 
    // how can i create a instance of this type? 
    Type type = getGenericsType(method); 
} 


public static Method getMethod(Method[] methods, String methodName) { 
    for (Method method : methods) { 
     if (method.getName().equalsIgnoreCase(methodName)) 
      return method; 
    } 
    return null; 
} 

private static Type getGenericsType(Method method) { 
    Type[] types = method.getGenericParameterTypes(); 
    for (int i = 0; i < types.length; i++) { 
     ParameterizedType pt = (ParameterizedType) types[i]; 
     if (pt.getActualTypeArguments().length > 0) 
      return pt.getActualTypeArguments()[0]; 
    } 
    return null; 
} 


+3

Убедитесь, что 'Type' является экземпляром класса (я сомневаюсь, что вы можете создать экземпляр любого другого типа) и использовать методы создания экземпляров из класса. – SJuan76

+0

Можете ли вы добавить код класса, который имеет свойство «List

»? Это облегчит тестирование. –

+1

Вы уверены, что это не проблема стирания типа? Также не на 100% ясно, в чем вопрос точно ... –

ответ

1

(Ответил в вопросе редактирования. Превращено в сообщество вики ответа см. Question with no answers, but issue solved in the comments (or extended in chat))

OP писал (а):

Я просто решил это с глупым решением,

его экземпляра типа дженериков с помощью Class.forName();

имя класса пришли из type.toString()

Type type = getGenericsType(method); 
Class<?> genericsType = null; 
try { 
    genericsType = Class.forName(getClassName(type)); 
    // now, i have a instance of generics type 
    Object o = genericsType.newInstance(); 
} catch (Exception e) { 

} 

static String NAME_PREFIX = "class "; 

private static String getClassName(Type type) { 
    String fullName = type.toString(); 
    if (fullName.startsWith(NAME_PREFIX)) 
     return fullName.substring(NAME_PREFIX.length()); 
    return fullName; 
} 

, кстати, есть код класса, который имеет a) List<Article>

public class NewsMsg { 
    private List<Article> articles; 

    public List<Article> getArticles() { 
     return articles; 
    } 

    public void setArticles(List<Article> articles) { 
     this.articles = articles; 
    } 
} 
Смежные вопросы