我有界面:
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
答案 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获得所需的行为。