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

时间:2014-09-30 13:07:10

标签: java unit-testing reflection

我有界面:

public interface Car{
    public void drive();
}

实施Car的类:

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

    }
}

使用Car作为方法参数的Class

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

我不想使用 getDeclaredMethod SuperCar 作为参数来调用 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

3 个答案:

答案 0 :(得分: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。因此,您将找不到任何带有此类参数的方法

答案 1 :(得分:0)

看起来很简单,只需将SuperCar投射到Car:

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

答案 2 :(得分:0)

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

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