2012-08-06 5 views
2

일부 상황에서는 리플렉션 API를 사용하여 유형 삭제를 통해 손실 될 수있는 일반 데이터 유형에 대한 정보를 얻을 수 있다고 언급 한 적이 있습니다.Java에서 삭제를 입력하는 예외는 무엇입니까?

유형 삭제가 완료되지 않았거나 리플렉션을 통해 액세스 할 수있는 상황의 전체 목록을 찾고 있습니다. 제네릭 형식에서 얻을 수있는 예제 및 관련 리플렉션 코드의 훌륭한 목록이 우수 할 것입니다.

업데이트http://tutorials.jenkov.com/java-reflection/generics.html에는 내가 원하는 예가 정확히 있습니다.

+0

이 질문을 끝내기로 결심했다면 의견을 보내 주시고 이유를 말씀해주십시오. – ams

+0

그 장소에 대한 링크가 도움이 될 것입니다. – Thilo

+0

@Thilo http://stackoverflow.com/questions/4713438/type-erasure-in-java는 모든 유형 정보가 손실되는 것은 아니라는 언급의 예입니다. – ams

답변

6

난 그냥이 내려 온다 생각 :

  • 없음 개체 인스턴스는 모든 종류의 정보를 저장하지 않습니다.

  • 클래스는, 그러나, 모든 일반적인 서명을 유지 그래서, 반사를 사용하여, 당신은에 대한 제네릭 형식 정보를 읽을 수 있습니다

(그렇지 않으면 당신은 제네릭 형식 컴파일시에 확인이 없습니다) 주어진 클래스.

예 :

class MyList extends ArrayList<MyObject>{} 

List<MyObject> x = new MyList(); 

반사 (이 정보는 myList에 클래스로 컴파일되기 때문에)이 MyObject를의 목록이 있음을 알려드립니다.

하지만

List<MyObject> x = new ArrayList<MyObject>(); 

반사 당신에게 유용한 아무것도 말하지 않을 것이다 (ArrayList의 클래스는 MyObject에 대해 아무것도 알고 있기 때문에).

+1

+1 일반적인 정보가 유지되는 이유는'javac' 컴파일러가 그 일을하기 위해서입니다. 예 : 이미 올바르게 컴파일 된 코드의 제네릭을 사용하여 코드를 컴파일 할 수 있어야합니다. –

+0

수퍼 클래스 외에도 비공개 필드 형식의 generics와 메서드 인수 및 반환 형식이 형식 검사를 위해 모두 있습니다. – newacct

+0

예, 모두 클래스 정의의 일부입니다. 위의 예는 모든 것을 망라하는 것이 아닙니다. 그러나이 모든 경우에 해당 제네릭은 필드/인수/반환 유형 * 정의 * (서명)에 사용할 수 있으며 할당 된 객체의 실제 런타임 값이 아님을 유의하십시오. – Thilo

2

일반 매개 변수의 특정 유형을 가진 제네릭 유형의 서브 클래스 인 명명 된 또는 익명의 클래스를 작성하면 해당 클래스는 일반이 아니며 유형 삭제의 대상이 아닙니다. 하위 클래스에 대해 Class 객체를 가져올 수 있다고 가정하면 해당 객체에 대한 반사를 사용하여 매개 변수 유형이 무엇인지 확인할 수 있습니다.

이것에 대해서 생각해 보면, 이것은 실제로 삭제 규칙의 "예외"는 아닙니다. 오히려, 문제의 클래스가 명시 적으로 그것을 reifying함으로써 일반 클래스가 아니라는 것을 조정합니다.

+0

" 매개 변수 유형은 "아니오, 확장하는 수퍼 클래스의 유형 매개 변수를 찾는 것입니다. – newacct