鉴于:
class A
{
public void m(List l) { ... }
}
假设我想m
通过反射调用方法,将ArrayList作为参数传递给m
:
List myList = new ArrayList();
A a = new A();
Method method = A.class.getMethod("m", new Class[] { myList.getClass() });
method.invoke(a, Object[] { myList });
第getMethod
3行将抛出NoSuchMethodException
异常,因为myList的运行时类型是ArrayList,而不是List。
有没有一种很好的通用方法可以不需要A类的参数类型知识?
如果您知道类型为List
,则将其List.class
用作参数。
如果您事先不知道类型,请想象您有:
public void m(List l) {
// all lists
}
public void m(ArrayList l) {
// only array lists
}
如果有任何自动方式,反射应调用哪种方法?
如果需要,可以使用Class.getInterfaces()
或,Class.getSuperclass()
但要视情况而定。
您可以在这里执行以下操作:
public void invoke(Object targetObject, Object[] parameters,
String methodName) {
for (Method method : targetObject.getClass().getMethods()) {
if (!method.getName().equals(methodName)) {
continue;
}
Class<?>[] parameterTypes = method.getParameterTypes();
boolean matches = true;
for (int i = 0; i < parameterTypes.length; i++) {
if (!parameterTypes[i].isAssignableFrom(parameters[i]
.getClass())) {
matches = false;
break;
}
}
if (matches) {
// obtain a Class[] based on the passed arguments as Object[]
method.invoke(targetObject, parametersClasses);
}
}
}
我有一个抽象超类和两个非抽象子类和。如何在超类方法中定义类型,如下所示 我允许在子类方法中编写具体类型(例如,或) 在上面的示例中,子类方法不会覆盖超类方法。
我有一个名为的超级类,我有3个子类,分别是,和。 在每个子类中,我都有私有参数,和。 我想在 类中创建一个名为 的方法,该方法从 中删除 1 并将 10 添加到中,以便我可以在 main 方法中调用它们时将该方法应用于所有子类。但是如何将私有参数从子类获取到超类中呢? 我不能在超类中声明它们,因为每个子类都有自己的默认启动参数,这些参数应该在游戏期间进行。
所以,问题是:我有一个抽象基类(),它有一个抽象成员方法()。方法返回布尔值,并应检查是否相等,但“相等”在子类中可能有不同的解释,因此我不重写或。因为它测试是否与另一个与其类型相同的对象相等,所以签名如下所示: 现在,当我试图在类中重写它时,假设“”,我不能使用作为参数的类型。我知道一般情况下这样做的原因和添加类型界限的建议,但是事情变得更加复杂,因为参数类型是它自己的类。 有没有什么平滑的方法
问题内容: 说我有一个像这样的课程: 它具有一个带有扩展它的类的层次结构: 然后在其他地方,我有一堂课利用了这些东西: 我是否可以指定A的子类,以便使用更具体的“某物”类覆盖setSomething方法?这就是我想要做的: 目前,我正在A类中执行以下操作: 如果SuperSomething的类型不适合这些类,则B类和C类在checkClass方法中引发异常。 编辑:我已经尝试使用上述确切的方法签名
我有一个类(为简单起见称为子类),它扩展了SuperClass并实现了IClass。我知道您可以通过使用super.method()调用SuperClass的方法,但是是否可以从SubClass调用它从IClass实现的方法? 例子: 子类: IClass: 我想从超类调用子类'implementedMethod()(它从IClass获得) 我该怎么做呢?
问题内容: spring框架使用的方法可以传递尽可能多的参数。 我想编写一个函数,它也可以接收无限量的数据。如何调用此功能,以便我可以阅读它。或如何定义它? 非常感谢。 问题答案: 它称为varargs。 它允许方法接受任意数量的参数。它们可以在方法中作为数组访问: 这是句法糖。编译器隐藏了数组的创建,因此而不是 你写