2014-09-16 1 views
0

리플렉션을 사용하여 런타임에 오브젝트 유형을 변경할 수 있습니까?리플렉션을 사용하여 런타임에서 오브젝트 유형 변경

개체의 인스턴스가 있다고 가정 해 봅시다. A. 유형이 B extend A 인 개체. A의 인스턴스 유형을 B으로 변경할 수 있으므로 AB으로 안전하게 전송할 수 있습니까?

어쩌면 최종 속성 .class 또는 유사한 트릭을 변경 하시겠습니까?

+1

아니요, _object_의 유형을 변경할 수 없습니다. –

답변

2

아니요, 불가능합니다. 언급 한 리플렉션을 사용하면 특정 클래스에 대해 클라이언트 코드를 컴파일하지 않고 런타임에 주어진 클래스를 발견 (즉, 메소드, 이름 등으로 필드 찾기)하고 런타임에 객체의 메소드 및 필드에 액세스 할 수 있습니다. 예를 들어 모든 클래스의 foo() 메소드를 호출 할 수 있습니다.

실제로 개체 유형을 변경하는 것은 전혀 의미가 없습니다. Object contains는 데이터와 메소드를 모두 가지고있는 speicific 클래스의 인스턴스입니다. 나는 어쨌든 sun.misc.Unsafe을 사용하여 런타임에 객체에 할당 된 메모리를 변경하는 방법을 상상할 수 있습니다. 그러나 객체와 관련된 특정 클래스에서 수행되는 메소드 구현을 어떻게 변경할 수 있는지 상상할 수도 없습니다.

여기에 여전히 남아있는 질문은 무엇입니까? 아마 당신의 과제를 설명하고 해결책 제안을 요청할 수 있습니까?

나는 다음을 추가 할 내 대답에 주석으로 영업 이익에 의해 게시 새로운 정보에 따라 편집

.

내가 이해하는 한, 다음과 같습니다.

AAFactory 클래스를 구현하는 타사 라이브러리가 있습니다. OP는 다음과 같은 코드를 사용합니다.

A a = AFactory.create(); 

그러나 그는 A이 필요하지 않습니다. 추가 기능을 구현하는 B extends A이 필요합니다.

가능한 해결책은 다음과 같습니다.

클래스 B extends A를 만듭니다

public class B extends A { 
    private final A a; 
    public B(A a) {this.a = a;} 
    // delegate all methods of A, i.e.: 
    @Override 
    public boolean isA() {return a.isA()} 

    // add your functionality, e.g. 
    public boolean isC() {/* your code here*/} 
} 

이제 다음과 같은이 클래스를 사용

A a = AFactory.create(); 
B b = new B(a); 

은 이제뿐만 아니라 B 및 추가 기능을 통해 A의 모든 기능을 사용할 수 있습니다.

+0

제 3 자 항아리에있는 공장에서 물건을 얻었습니다. 이제 그것을 연장해야합니다. 이러한 객체에는 다음과 같은 메소드가 있습니다. isA, isB ... 객체의 유형을 구별하기 위해 ... 이제이 객체를 확장해야하며, 보게되는 유일한 해결책은 새로운 확장 클래스에 isC 메소드를 추가하는 것입니다. 나는 isA, isB, isC의 접근법을 싫어하고이 객체의 클래스를 A 클래스, B 클래스 또는 C 클래스로 변경할 수 있다고 생각했습니다. –

+0

개체를 확장 할 수 없습니다. 수업을 연장 할 수 있습니다. 몇 분 후에 내 답변에 추가 사항을 확인하십시오. – AlexR

+0

@danielsp, 제 답변에 추가 된 내용을 읽고 도움이되는지 알려주세요. – AlexR

관련 문제