【问题标题】:Why getDeclaredMethod doesn't work with arguments which are in relation instanceof with specific method? [duplicate]为什么 getDeclaredMethod 不适用于与特定方法相关的 instanceof 参数? [复制]
【发布时间】:2023-03-06 06:31:01
【问题描述】:

我有接口:

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

【问题讨论】:

  • 使用args[0] = Car.class;

标签: java unit-testing reflection


【解决方案1】:

如果你看到 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。因此,您将找不到任何具有此类参数的方法

【讨论】:

    【解决方案2】:

    看起来很简单,只需将 SuperCar 转换为 Car:

    public sellCarTest(){
        **Car** superCar = new SuperCar();
        CarDealer carDealer = new CarDealer();
        // ... rest of the method
    }
    

    【讨论】:

      【解决方案3】:

      Class.get*Method() 查找具有您指定类型的参数的方法。它不尊重您指定的类型与方法的形参类型之间的子类型关系;它也不尊重原始/包装关系或原始扩展。

      您也许可以通过使用 java.beans.Statement 或 java.beans.Expression 获得所需的行为。

      【讨论】:

        猜你喜欢
        • 2012-12-23
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        相关资源
        最近更新 更多