我正在尝试制作一个参数为Country.class
,User.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));
然而,这根本不起作用。
请问我该怎么办?
答案 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);
}
是调用它的实例(没有实例;它是一个类方法)。由于null
是Long
,因此需要转化为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.class
是Class<Country>
类型的对象。
答案 5 :(得分:0)
回复你对ZZ Coder的评论; Java中的静态方法在类的名称空间上下文中调用,例如类Model.count()
中的静态方法count()
,但该方法不会成为{{1}的一部分} {},Model
是描述类Model.class
的{{1}}实例。 (我可以看到混淆源自哪里,拥有一个包含静态方法的专用Model.class
是合乎逻辑的,但Java并不是这样设计的。)
您的出路是使用反射为您传递给代码的类调用静态Class
。
答案 6 :(得分:-1)
您正在传递Country.class
Class
对象。它是一个Model
对象?