【问题标题】:Java Generics and reflection!Java泛型和反射!
【发布时间】:2009-06-02 14:31:51
【问题描述】:

我有一个看起来像这样的类:

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);

此代码在运行时失败,并显示“没有此类方法异常”。 现在,如何正确设置参数类型?!这样构造函数中的通用映射参数就被识别了吗?

【问题讨论】:

  • Format 是这样的实现: public interface FormatFactory { public Map getFormat();公开课 getMappingBean(); }

标签: java generics reflection


【解决方案1】:

构造函数是受保护的——如果你将它公开使用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(),因为我刚刚发现(但为时已晚!)。
  • doesn't work 再次抛出此异常:java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean.(java.util.Map)
  • getDeclaredConstructor() 是否需要 setAccessible(true)?在我的测试中它没有,但我没有尝试将 main() 与 UploadBean 分开。
  • @Jay:那么请提供一个简短但完整的程序。如果你使用了正确的类并且它有正确的构造函数,那应该没问题。它适用于我的测试。
  • 特别是,XYZUploadBean 有正确的构造函数吗?您已经展示了 UploadBean,但没有展示 XYZUploadBean...
【解决方案2】:

泛型信息在运行时不可用,它只是用于静态分析,所以就像泛型不存在一样。

【讨论】:

  • 是的,错误确实与泛型无关;这实际上只是一个反思问题。 (但很高兴澄清这一点。)
【解决方案3】:

我相信你需要打电话

ct.setAccessible(true)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多