java - 为什么 getDeclaredMethod 不适用于与特定方法相关的参数?

标签 java unit-testing reflection

我有接口(interface):

public interface Car{
    public void drive();
}

实现汽车的类:

public class SuperCar implements Car{
    @Override
    public void drive(){

    }
}

以及使用 Car 作为方法参数的类

public class CarDealer{
    public void sellCar( Car car)
}

我不想使用 getDeclaredMethodSuperCar 作为参数来调用 sellCar 方法,但由于不同的原因,它找不到它参数类型(Car vs SuperCar)

public sellCarTest(){
    SuperCar superCar = new SuperCar();
    CarDealer carDealer = new CarDealer();
    Class dealer = CarDealer.class;
    Class[] args = Class[1];
    args[0] = superCar.getClass();
    Method m = dealer.getDeclaredMethod("sellCar", args);
    m.setAccessible(true);
    m.invoke(carDealer, superCar);
}

编辑

实际上我已经看到一段代码粘贴在接受的答案中,但它仍然没有给我正确的答案。

我在这里找到了答案 Testing private method using power mock which return list of Integers

最佳答案

如果您查看 Class 类的 java 源代码,您可以看到它比较为获取方法而给出的参数的方式

private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
    if (a1 == null) {
        return a2 == null || a2.length == 0;
    }

    if (a2 == null) {
        return a1.length == 0;
    }

    if (a1.length != a2.length) {
        return false;
    }

    for (int i = 0; i < a1.length; i++) {
        if (a1[i] != a2[i]) {
            return false;
        }
    }

    return true;
}

您可以快速检查

    Object X = P.class;
    Object Y = Q.class;// Q implements P
    System.out.println(X == Y);

将始终打印false。所以你不会找到任何带有这样的参数的方法

关于java - 为什么 getDeclaredMethod 不适用于与特定方法相关的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121681/

相关文章:

reflection - 将 slice 复制到反射数组中

reflection - 当属性名称来自另一个来源时,如何在 C# 4 中动态设置类的属性而不使用反射(动态)

java - 关闭此游标对象以防止游标异常的正确方法

java - Java8 中不合逻辑的类型推断

.net - 用于可移植类库测试的 NUnit

java - 如何在测试过程中使用Mapstruct创建的映射器作为@Mock

java - 我是否会在使用 PhantomReferences 完成时避免使用反射?

java - 从类名中检索类的实例

java - 递归时间序列分割算法

c++ - 如何在 C 代码上从终端运行 Google 测试?