在Java中传递一个类(“Country.class”)作为参数

时间:2010-05-22 20:08:29

标签: java casting

我正在尝试制作一个参数为Country.classUser.class等的方法,然后返回argument.count()

我将为此方法提供的所有可能类都从Model延伸,并使用方法count()

我的代码:

private static long <T> countModel(Model<T> clazz)
{
    // there is other important stuff here, which prevents me from
    // simply by-passing the method altogether.

    return clazz.count();
}

来电:

renderArgs.put("countryCount", countModel(Country.class));

然而,这根本不起作用。

请问我该怎么办?

7 个答案:

答案 0 :(得分:5)

我想你想做

private long countModel(Class<? extends Model> clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
  Method countMethod =  clazz.getDeclaredMethod("count", null);
  return (Long) countMethod.invoke(null, null);
}

希望这样的事情能起作用(我的反思能力不是那么好)。

答案 1 :(得分:2)

不完全了解您要实现的目标。你是说这个吗?

private static long <T> countModel(Model<T> model)
{
    return model.count();
}

renderArgs.put("countryCount", countModel(country));

编辑:如果count是静态方法,则它与模型无关。静态方法不是继承的。所以你要做的就是直接调用它,

renderArgs.put("countryCount", Country.count());

答案 2 :(得分:1)

澄清一下,你想要一个被约束为具有特定类方法(A)的类(B),并且你希望将该类作为参数传递给其他方法({{1并且让该方法(C)在该类(C)上调用该类方法?

第一部分,即类型约束,无法完成。 Java的类型系统不能那样工作。

第二部分,将一个类作为参数传递并在其上调用一个类方法,可以使用反射完成。这是如何做到这一点,从你的代码纠正(虽然你应该更加小心我的例外情况)。

A.B()

private static <T extends Model> long countModel(Class<T> clazz) throws Exception { return (Long) clazz.getMethod("count").invoke(null); } 是调用它的实例(没有实例;它是一个类方法)。由于nullLong,因此需要转化为invoke()。 type参数必须在结果类型之前。整个事情可以将作为Object的子类的任何类作为参数;如果Model方法不存在,它将在运行时失败。他们是休息。

(另请注意,如果您想将参数传递给count,则必须在count()中指定这些参数的类,并将值本身指定为getMethod case作为后续参数。两者都支持Java5变量参数列表。)

答案 3 :(得分:0)

在第

renderArgs.put("countryCount", countModel(Country.class));

您使用countModel致电Class<Country>,但您必须使用Country这样的实例来调用它:

Country country = new Country();
renderArgs.put("countryCount", countModel( country );

答案 4 :(得分:0)

您没有在此处传递国家/地区的实例,而是传递了Class对象:

renderArgs.put("countryCount", countModel(Country.class));

您需要实例化一个模型并将其作为参数传递:


Model model = new Country();
renderArgs.put("countryCount", countModel(model));


Country country = new Country();
renderArgs.put("countryCount", countModel(country));

在这种情况下,Country.classClass<Country>类型的对象。

答案 5 :(得分:0)

回复你对ZZ Coder的评论; Java中的静态方法在类的名称空间上下文中调用,例如类Model.count()中的静态方法count(),但该方法不会成为{{1}的一部分} {},Model是描述类Model.class的{​​{1}}实例。 (我可以看到混淆源自哪里,拥有一个包含静态方法的专用Model.class是合乎逻辑的,但Java并不是这样设计的。)

您的出路是使用反射为您传递给代码的类调用静态Class

答案 6 :(得分:-1)

您正在传递Country.class Class对象。它是一个Model对象?