2013-11-27 1 views
0

나는 다음과 같은 상황이 있습니다형식 정보를 사용할 수 없을 때 개인 내부 클래스에 캐스팅하는 방법?

// In some library code 
public class A 
{ 
    private class B 
    { 
     Object value; 
    } 
} 

// In my code 
Object o; 

// o is initialized to an instance of B somehow 
// ... 

B bInstance = (B) o; 

나는 B의 유형에 액세스 할 수없는 주어진 B 를 입력 개체를 캐스팅 가겠어요 어떻게?

더 자세히 설명하려면 A는 이 아니며 내 코드 기반의 일부분은입니다. 그것은 도서관의 일부입니다. 유형 정보가 표시되지 않기 때문에 유형 B라는 것을 알고있는 객체에 액세스 할 수 있지만이를 (예 : IDE에서) 변환 할 수 없습니다. 컴파일 오류입니다. 상황은 매우 제한적입니다. 리플렉션을 사용하여이를 달성하는 것이 가능할 수 있다고 생각하지만 특정 패러다임을 사용한 경험이 많지 않습니다. 이 주위에 어떤 방법이 있습니까? 커뮤니티가 제공 할만한 의견을 보내 주시면 감사하겠습니다.

+4

개인 내부 클래스 사용에 대한 한 가지 사실은 다른 사람이 사용하지 못하도록하는 것입니다. 너 왜이쪽으로가는거야? 손에 무슨 문제가 있습니까? –

+0

'B' 인스턴스에서 호출 할 방법이 있습니까? 당신은 단지'toString()'을 사용할 수도 있고, 리플렉션을 사용하여 인스턴스를 통해 B에서 임의의 메소드를 호출 할 수도 있습니다. –

+0

올바르게 작동합니다. 나는 당신이 그것에 대한 참조를 가지고 있기 때문에 B가 어떤 인터페이스를 구현한다고 가정한다. 인터페이스 참조가 충분하지 않다는 것을 당신은 무엇을하려고합니까? –

답변

0

아마도 액세스해야하는 인터페이스가 있습니까? 아니면 너무 나쁜가?

나는 다음 당신이 필요하지만, 어쩌면이 (당신이 반사의 사용을 요구하기 때문에) 당신이 해결 방법을 찾을 수 있습니다 무엇인지 모르는 : 당신이 시도해야 당신이 어떻게 든 B 인스턴스를 가지고 있기 때문에

:

Field allFields[] = innerClass.getDeclaredFields();  
Constructor<?> constructors[] = innerClass.getDeclaredConstructors(); 
Method allMethods[] = innerClass.getDeclaredMethods(); 

constructor.setAccessible(true); sets the constructor accessible. 

이 인스턴스를 인스턴스화 할 수 있습니다 자신을하거나 내가있다 :

Class<?> innerClass = o.getClass(); 

그리고 가능하면 다음과 같이 반사를 사용하여 당신이 필요로하는 무엇을 얻으려고

어떻게 든 돌려받는 것이 중요합니까?

+0

이 특별한 경우에는 사용할 수있는 공용 인터페이스가있었습니다. 웬일인지 내 마음을 결코 넘어서게하지 않았다. 고맙습니다! –

+0

자, 환영합니다. :) –