当前位置: 首页 > 面试题库 >

Java getMethod在方法中具有超类参数

梁丘远航
2023-03-14
问题内容

鉴于:

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 });

getMethod3行将抛出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。 它允许方法接受任意数量的参数。它们可以在方法中作为数组访问: 这是句法糖。编译器隐藏了数组的创建,因此而不是 你写