2012-05-24 21 views

답변

20

제네릭 아름답게 설명 인쇄, 그들은 단지 오류를 결정하는 컴파일러에 대한 추가 정보를 제공합니다. 실제로는 .class 파일에서 메서드의 서명을 변경하지 않습니다.

즉, T 유형을 지정하는 대신 Object 유형을 지정한다는 점을 제외하면 Java에서 비 제너릭 메소드를 호출하는 것과 완전히 똑같은 방식으로 Java에서 리플렉션으로 일반 메소드를 호출한다는 의미입니다.

반사 방식으로 일반적인 방법을 호출하는 방법에 대한 자습서가 너무 많아서 다른 것을 추가하는 것을 주저합니다. 그러나 리플렉션을 통해 메서드를 호출하는 방법에 대한 지침이 필요한 경우 아래에 주석을 추가하고 필요한 코드를 추가합니다.

예상대로 작동하지 않는 경우 컴파일 된 클래스 파일에서 항상 javap을 실행하여 인수 목록에서 올바른 개체를 사용하고 있는지 확인할 수 있습니다. <T extends List> 유형 일반 서명을 지정하면 결과 매개 변수 객체는 실제로 List 객체 일 수 있습니다. 우리가 사용하는 에드윈의 대답에 주어진 점을 강조하기 위해

10

이것은 저에게 적합합니다.

Method method = Person.class.getMethod("print", Object.class); 

method.invoke(new Person(), "this is a string"); 
method.invoke(new Person(), 273); 
method.invoke(new Person(), new Object()); 

은 물론

this is a string 
273 
[email protected] 

이 뒤에 이론이 컴파일시에 삭제됩니다 @Edwin's answer.

4

는 일반적인 유형으로 연장 : 당신이

GenericHibernateDao<T extends Serializable> 

같은 클래스 및 방법이있는 경우

public T save(T entity) {}; 

를 호출

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class); 

와 N을 : 당신은 즉, 직렬화 클래스를 사용할 필요가 반사를 사용하여 저장 방법, 당신은 사용할 필요가 사용하고 있기 때문에 Object.class를 매개 변수로 사용합니다.

<T extends Serializable>