如果构造函数参数是继承类,则创建类反射

时间:2013-04-15 16:59:30

标签: spring reflection

问题:如果类构造函数包含继承类参数,如何正确创建类反射? 我有:

interface Car {}
class SportCar implement Car{}
class CarService {
  public CarService(String str, Car car) {
     ...
  }
}

但是,当我尝试做的时候:

Class c = Class.forName("vbspring.model.CarService");
Class[] paramTypes = {String.class, SportCar.class};
Constructor constr = c.getDeclaredConstructor(paramTypes);

它抛出: java.lang.NoSuchMethodException:vbspring.model.CarService。(java.lang.String,vbspring.model.SportCar)

P.S。我的.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="carService" class="model.CarService">
        <constructor-arg value="Car Rental Service"/>
        <constructor-arg ref="sportCar"/>
        <property name="startCar"/>
    </bean>

    <bean id="sportCar" class="model.SportCar"/>

</beans>

编辑:我尝试编写类似我自己的Spring Framework的东西。我必须创建不仅属于Car层次结构的类,所以我尝试编写可以创建任意类型的类的通用方法。 我不能写:Class[] paramTypes = {String.class, Car.class};

我必须写一些普遍的东西,比如:

paramTypes[index++] = obj.getClass();

其中obj - 是解析器从.xml中提取的SportCar或Car bean

1 个答案:

答案 0 :(得分:0)

错误java.lang.NoSuchMethodException: vbspring.model.CarService.(java.lang.String, vbspring.model.SportCar)表示您没有像

这样的构造函数
public CarService(String, SportCar)

你没有。你有:

public CarService(String, Car) {

将您的代码更改为

Class c = Class.forName("vbspring.model.CarService");
Class[] paramTypes = {String.class, Car.class}; // the constructor takes Car not SportsCar
Constructor constr = c.getDeclaredConstructor(paramTypes);

然后,当您调用构造函数以获取新实例时,您可以传递SportsCar实例或任何其他Car实例。

constr.newInstance("sport", new SportsCar());
// or
constr.newInstance("a jeep", new Jeep());
// or
constr.newInstance("long car", new Limousine());

假设JeepLimousine实施Car