2011-12-20 3 views
2

직접 인스턴스화 할 수없는 Java 클래스가 있습니다. 필드 중 하나의 기본값이 무엇인지 알아야합니다.Java : 인스턴스없이 인스턴스의 기본값을 가져올 수 있습니까?

Class Foo { 
    private Bar field = new Bar("baz"); // can I know that field 
             // is set to new Bar("baz")? 
} 
+0

더 많은 것을 우리에게주세요. 너 정확히 뭘 하려구? – ApprenticeHacker

+1

그럼 간접적으로 인스턴스화해야합니다 :-) – nowaq

답변

1

간단히 말하면됩니다.

그러나 동시에, 당신은 정말로 끔찍한 해킹을 할 수 있습니다.

리플렉션을 사용하여 객체를 만든 다음 객체의 상태를 public으로 변경하여 액세스 할 수 있도록하고 값을 가져올 수 있습니다. 이것은 정말로 나쁘지만, 가능하다고 생각합니다. 코드는 준비가되어 있지 않지만, 리플렉션을 사용하여 객체를 인스턴스화하기 위해 인터넷에 10 억 개의 코드 샘플이 있다고 확신합니다. 내가 제대로 이해하면

+2

+1 정말 끔찍한 해킹입니다. 제발하지 말아요 :) –

+0

자바가'default (T)'함수를 가지기를 바랍니다. – ApprenticeHacker

+1

적어도 테스트 환경에서 해보십시오. 이는 프로덕션 시스템에서 만연하기를 원하는 코드 종류가 아닙니다. – corsiKa

-1

이 같은 그 필드의 값을 반환하는 방법을 만들 수 있었다 : 당신이 방법 getBar()를 사용할 때마다 다음

public Bar getBar() { 
    return field; 
} 

을; 코드에서 필드의 현재 값인 field를 반환합니다. (아마도 필드의 이름을 변경해야합니다)

필드를 설정하기 전에 기본값을 실행하기 만하면됩니다.

0

당신은 @glowcoder가 묘사 한 두려운 아직 무서운 해킹을 사용하여 이것을 달성 할 수있을 것입니다. 그러나 Java 및 사용자의 코드를 유지할 사람은 누구나이를 권장하지 않습니다.

기본값을 확인하는 방법을 제안합니다. (이전 getter/setter) 어쨌든 인스턴스화를 원하지 않는 이유는 알 수 없습니다. 특별한 이유가 있습니까?

1

인스턴스를 생성 할 수없는 경우 해당 필드 중 하나의 값을 가져올 수 없습니다.

사실, 그것에 대해 생각할 때 이것은 완전히 무의미합니다. 필드 값 (특정 Bar 오브젝트에 대한 오브젝트 참조) Bar 오브젝트가 작성 될 때까지에 존재하지 않습니다. 그리고 그 경우에만 Foo 개체가 인스턴스화 될 때 발생합니다.

그 (떨어져 String)에서 참조 유형 field 자바 상수 식으로 초기화 한 경우에 더 의미를 만들 것입니다,하지만 당신은 할 수 없습니다.


여기에서만 가능 호기심

간접적으로 또는 자바 가시성 제한을 깰 반사 setAccessible를 사용하여 Foo 객체를 생성 할 수있을 것입니다. 그러나 그렇다고하더라도 아직 존재하지 않는 객체의 (의미없는) 필드 값이 아닌 ... Foo 객체의 field 값을 인스턴스화했습니다.

1

필드가 초기화되는 방법에 대한 자세한 내용은 생성자에 있습니다. (setAccessible (true)를 사용하여)해야 할 필요가 있다면 반사를 사용하여 생성자를 호출 할 수 있습니다. 어떤 이유로 든 호출 할 수없는 경우 클래스의 바이트 코드를 읽어 각 필드를 초기화 할 것인지 결정할 수 있습니다.(이것은 실질적으로 생성자를 호출하는 것과 동일하지만 완전한 제어권을가집니다.)

0

바이트 코드를 직접 파싱 할 수 있습니다. 간단한 클래스의 경우 너무 힘들어서는 안되지만 다음과 같은 클래스를 상상해보십시오 :

public class Foo { 
    private Bar field = OtherClass.someStaticMethod(); 
} 

그러면 훨씬 더 어려울 것입니다.

관련 문제