2013-04-15 2 views
0

질문 : 클래스 생성자에 상속 클래스 인수가 포함되어 있으면 어떻게 올바르게 반영 할 수 있습니까?생성자 인수가 상속 클래스 인 경우 클래스 리플렉션을 생성하십시오.

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

가 발생합니다 : java.lang.NoSuchMethodException : 내가하려고 할 때,

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

을하지만 : 나는 있습니다. vbspring.model.CarService을 (java.lang.String의를 vbspring .model.SportCar)

PS 내 .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> 

편집 : 나는 내 자신의 스프링 프레임 워크와 같은 뭔가를 작성하려고합니다. 차 계층 구조에 속하는 클래스뿐만 아니라 임의의 클래스를 생성 할 수있는 보편적 인 메소드를 작성해야합니다. 나는 쓸 수 없습니다 : Class[] paramTypes = {String.class, Car.class};

내가 좋아하는 보편적 인 뭔가 작성해야합니다 :

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

- SportCar 또는 자동차 콩 파서에 의해 .XML에서 가져가

오류

답변

0

java.lang.NoSuchMethodException: vbspring.model.CarService.(java.lang.String, vbspring.model.SportCar)을 상태를

public CarService(String, SportCar) 

다음과 같은 생성자가 없습니다. 당신은이 :

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

public CarService(String, Car) { 

변경 코드를 새 인스턴스를 얻을 수있는 생성자를 호출 할 때 다음, 당신이 SportsCar 인스턴스 또는 그 문제에 대한 모든 다른 Car 인스턴스를 전달할 수 있습니다.

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

Car을 구현 JeepLimousine 가정.

+0

나는 그렇게 할 수 없다. 내 자신의 스프링 프레임 워크와 같은 것을 쓰고 싶기 때문에 모든 반사 유형에이 코드를 사용해야한다. SubClass를 SuperClass 또는 SuperInterface로 자동 변환 할 수 있습니까? –

+0

@AndrewMelnuk 나는 당신이하는 말을 이해하지 못합니다. 저는 그렇게 할 수 없습니다. 왜 안돼? 'CarService' 생성자는'Car' 인스턴스를 인자로 취합니다. 이것이 메소드 정의입니다. 리플렉션을 통해 검색 할 때 해당 정의를 사용해야합니다. –

+0

SAX 파서에 모든 객체를 작성하므로 객체의 클래스를 자동으로 가져옵니다. 'paramTypes [index ++] = obj.getClass();'. 그래서 현재 객체가 Car, SportCar 클래스인지 여부를 알 수 없습니다. 또한 다른 계층 구조 (Car가 아닌)에 속할 수 있습니다. –