Java泛型和反射技术!

5

我有一个类,长这样:

public class UploadBean {


    protected UploadBean(Map<String,?> map){ 
        //do nothing.
    }
}

为了使用反射并调用相应的构造函数创建一个对象,我编写了以下代码:
Class<?> parTypes[] = new Class<?>[1];
parTypes[0] = Map.class;
Constructor ct = format.getMappingBean().getConstructor(parTypes);
Object[] argList  = new Object[1];
argList[0] = map;
Object retObj = ct.newInstance(argList);

这段代码在运行时出现了“没有这个方法的异常”。那么,我该如何正确设置参数类型?以便于识别构造函数中的泛型映射参数。

格式工厂是这个的实现:public interface FormatFactory { public Map<String, Class> getFormat(); public Class<? extends UploadBean> getMappingBean(); } - Jay
3个回答

7
构造函数是受保护的 - 如果您将其公开或使用getDeclaredConstructor而不是getConstructor,则应该可以工作。
(如果您试图从通常无法访问的位置调用此函数,则需要使用setAccessible。)
编辑:这里有一个测试,以显示它正常工作:
import java.lang.reflect.*;
import java.util.*;

public class UploadBean {

    // "throws Exception" just for simplicity. Not nice normally!
    public static void main(String[] args) throws Exception {
        Class<?> parTypes[] = new Class<?>[1];
        parTypes[0] = Map.class;
        Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes);
        Object[] argList  = new Object[1];
        argList[0] = null;
        Object retObj = ct.newInstance(argList);
    }

    protected UploadBean(Map<String,?> map){ 
        //do nothing.
    }
}

或者使用getDeclaredConstructor(),我刚发现这一点(但太晚了!)。 - Michael Myers
无法工作 再次抛出此异常: java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean.<init>(java.util.Map) - Jay
getDeclaredConstructor()需要setAccessible(true)吗?在我的测试中似乎不需要,但我没有尝试将main()与UploadBean分离。 - Michael Myers
@Jay:请提供一个简短但完整的程序。如果您正在使用正确的类并且它具有正确的构造函数,那应该没问题。在我的测试中它是有效的。 - Jon Skeet
特别是,XYZUploadBean是否有正确的构造函数?你展示了UploadBean,但没有XYZUploadBean... - Jon Skeet

1

通用信息在运行时不可用,仅供静态分析使用,因此请按照不存在泛型的方式进行操作。


1
是的,这个错误实际上与泛型无关;这只是一个反思问题。(但澄清这一点很好。) - Michael Myers

0

我相信你需要调用

ct.setAccessible(true)

setAccessible方法允许您覆盖访问方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接