使用Java Reflection实例化对象

时间:2016-05-23 19:10:13

标签: java reflection junit

我正在使用private测试JUnit方法,我正在使用Reflection调用它。我得到的错误是java.lang.InstantiationException。我知道它不是创建Class的实例,但我不确定我做错了什么。 Object object = clazz.newInstance();是引发Exception的行。

待测方法

 private int _getType(String type) {
    if ("DATE".equalsIgnoreCase(type)) return Types.DATE;
    if ("STRING".equalsIgnoreCase(type)) return Types.VARCHAR;
    if ("INT".equalsIgnoreCase(type)) return Types.INTEGER;
    if ("TIMESTAMP".equalsIgnoreCase(type)) return Types.TIMESTAMP;

    return Types.NULL;

}

JUnit测试

@Test
public void testGetType() throws Exception {
    String type1 = "DATE";
    String type2 = "STRING";
    String type3 = "INT";
    String type4 = "TIMESTAMP";

    Class clazz = SpringStoredProcImpl.class;
    Object object = clazz.newInstance();

    Method method = object.getClass().getDeclaredMethod("getType", String.class);
    method.setAccessible(true);

    method.invoke(object, type1);

我还没有断言,所以请忽略它。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您尝试创建一个* { box-sizing: border-box; } html, body { margin: 0; height: 100%; } .container { height: 100%; } .col-1{ float: left; width: 33%; overflow: auto; } .col-2{ float: left; width: 67%; position: relative; } .col-2 .content { position: absolute; left: 0; right: 0; top: 20px; /* header height */ bottom: 20px; /* footer height */ overflow: auto; } .header, .footer { height: 20px; background-color: red; position: absolute; left: 0; right: 0; } .header { top: 0; } .footer { bottom: 0; } 的实例,在您的情况下确实存在。

由于构造函数为no argument constructor,您应首先使用public关键字创建对象,然后从new开始执行其余代码

仅供参考,如果你想通过反思创建你的对象,那就像Method method...而不是clazz.getConstructor(DataSource.class, String.class, ArrayList.class).newInstance(dataSource, sprocName, params)

答案 1 :(得分:0)

不同的答案:不要这样做。

为什么您认为需要将此方法设为私有?看起来这个方法的责任是根据字符串输入“查找”枚举类型。我认为简单地使这个方法包受到保护并避免反射开销/麻烦会更有意义。