如何通过java.lang.reflect.Type创建实例

如何通过java.lang.reflect.Type创建实例,java,reflection,Java,Reflection,我想使用reflect设置类的属性,我的类有一个列表属性 我只是通过下面的代码得到列表的泛型类型 Method[] methods = target.getClass().getMethods(); String key = k.toString(), methodName = "set" + key; Method method = getMethod(methods, methodName); if (Iterable.class.isAssignableFrom(method.getPar

我想使用reflect设置类的属性,我的类有一个
列表
属性

我只是通过下面的代码得到
列表的泛型类型

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;
}
Method[]methods=target.getClass().getMethods();
String key=k.toString(),methodName=“set”+key;
Method=getMethod(方法,方法名称);
if(Iterable.class.isAssignableFrom(method.getParameterTypes()[0])){
//在那里,我得到了列表的泛型类型
//如何创建此类型的实例?
类型类型=getGenericsType(方法);
}
公共静态方法getMethod(方法[]方法,字符串方法名){
用于(方法:方法){
if(method.getName().equalsIgnoreCase(methodName))
返回法;
}
返回null;
}
私有静态类型getGenericsType(方法){
Type[]types=method.getGenericParameterTypes();
for(int i=0;i0)
返回pt.getActualTypeArguments()[0];
}
返回null;
}

(在问题编辑中回答。转换为社区wiki答案。请参阅)

OP写道:

我只是用一个愚蠢的办法解决了

它的实例化泛型类型使用
Class.forName()

类名来自
type.toString()

Type Type=getGenericsType(方法);
类genericsType=null;
试一试{
genericsType=Class.forName(getClassName(type));
//现在,我有一个泛型类型的实例
对象o=genericsType.newInstance();
}捕获(例外e){
}
静态字符串名称\u PREFIX=“class”;
私有静态字符串getClassName(类型){
字符串fullName=type.toString();
if(全名.startsWith(名称前缀))
返回fullName.substring(NAME_PREFIX.length());
返回全名;
}
顺便说一句,类的代码有
列表

公共类新闻消息{
私人物品清单;
公共列表getArticles(){
归还物品;
}
公共物品(列出物品){
这个.文章=文章;
}
}

确保
类型
的实例(我怀疑您是否可以实例化任何其他类型),并使用
中的实例化方法。是否可以添加具有
列表
属性的类的代码?这将使测试更容易。您确定这不是类型擦除问题吗?而且问题到底是什么还不是100%清楚。。。
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;
}
public class NewsMsg {
    private List<Article> articles;

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

    public void setArticles(List<Article> articles) {
        this.articles = articles;
    }
}