我有一个带有以下签名的Java方法:
public <T> List<HtmlOptionsComposite> convertToHtmlOptionsCompositeList
(List<? extends T> objects,
Class<T> clazz,
String getValueMethodName,
String getDescriptionMethodName,
String getDiscontinuedMethodName)
{ ... }
方法需要clazz
参数才能对每个给定对象使用反射(clazz.getMethod(...)
),但是我真的需要将其作为参数传递给方法吗?有什么方法可以重构代码来找出clazz应该自动生成的内容吗?
答案 0 :(得分:3)
您可以在列表中的第一个对象上调用getClass()
。这会给你一个Class<? extends T>
而不是Class<T>
- 特别是这意味着可能会有一些不应该给出的方法(因为它们不是T
上的方法本身)。
答案 1 :(得分:1)
考虑:
public interface T {
void foo ();
}
class S {
private class U implements T {
public void foo () { ... }
}
private class V implements T {
public void foo () { ... }
}
}
如果使用列表的第一个实例的类,那么它可能与列表的其他实例的类不同 - 列表可能是S.U和S.V实例的混合。因此,您需要在列表中的每个实例上调用getClass()
。
此外,尽管T.foo()是公共的,但是U和V中的实现将不能在S之外访问,因为U和V是私有类。
因此,如果没有class参数,则需要获取其类的每个元素,按名称查找方法并设置该方法可访问。这是可能的,但这比一次获得公共方法要多得多。