직접 인스턴스화 할 수없는 Java 클래스가 있습니다. 필드 중 하나의 기본값이 무엇인지 알아야합니다.Java : 인스턴스없이 인스턴스의 기본값을 가져올 수 있습니까?
Class Foo {
private Bar field = new Bar("baz"); // can I know that field
// is set to new Bar("baz")?
}
직접 인스턴스화 할 수없는 Java 클래스가 있습니다. 필드 중 하나의 기본값이 무엇인지 알아야합니다.Java : 인스턴스없이 인스턴스의 기본값을 가져올 수 있습니까?
Class Foo {
private Bar field = new Bar("baz"); // can I know that field
// is set to new Bar("baz")?
}
간단히 말하면됩니다.
그러나 동시에, 당신은 정말로 끔찍한 해킹을 할 수 있습니다.
리플렉션을 사용하여 객체를 만든 다음 객체의 상태를 public으로 변경하여 액세스 할 수 있도록하고 값을 가져올 수 있습니다. 이것은 정말로 나쁘지만, 가능하다고 생각합니다. 코드는 준비가되어 있지 않지만, 리플렉션을 사용하여 객체를 인스턴스화하기 위해 인터넷에 10 억 개의 코드 샘플이 있다고 확신합니다. 내가 제대로 이해하면
+1 정말 끔찍한 해킹입니다. 제발하지 말아요 :) –
자바가'default (T)'함수를 가지기를 바랍니다. – ApprenticeHacker
적어도 테스트 환경에서 해보십시오. 이는 프로덕션 시스템에서 만연하기를 원하는 코드 종류가 아닙니다. – corsiKa
이 같은 그 필드의 값을 반환하는 방법을 만들 수 있었다 : 당신이 방법 getBar()를 사용할 때마다 다음
public Bar getBar() {
return field;
}
을; 코드에서 필드의 현재 값인 field를 반환합니다. (아마도 필드의 이름을 변경해야합니다)
필드를 설정하기 전에 기본값을 실행하기 만하면됩니다.
당신은 @glowcoder가 묘사 한 두려운 아직 무서운 해킹을 사용하여 이것을 달성 할 수있을 것입니다. 그러나 Java 및 사용자의 코드를 유지할 사람은 누구나이를 권장하지 않습니다.
기본값을 확인하는 방법을 제안합니다. (이전 getter/setter) 어쨌든 인스턴스화를 원하지 않는 이유는 알 수 없습니다. 특별한 이유가 있습니까?
인스턴스를 생성 할 수없는 경우 해당 필드 중 하나의 값을 가져올 수 없습니다.
사실, 그것에 대해 생각할 때 이것은 완전히 무의미합니다. 필드 값 (특정 Bar
오브젝트에 대한 오브젝트 참조) 은 Bar
오브젝트가 작성 될 때까지에 존재하지 않습니다. 그리고 그 경우에만 Foo
개체가 인스턴스화 될 때 발생합니다.
그 (떨어져 String
)에서 참조 유형 field
자바 상수 식으로 초기화 한 경우에 더 의미를 만들 것입니다,하지만 당신은 할 수 없습니다.
여기에서만 가능 호기심
는 간접적으로 또는 자바 가시성 제한을 깰 반사 setAccessible를 사용하여Foo
객체를 생성 할 수있을 것입니다. 그러나 그렇다고하더라도 아직 존재하지 않는 객체의 (의미없는) 필드 값이 아닌 ...
Foo
객체의
field
값을 인스턴스화했습니다.
필드가 초기화되는 방법에 대한 자세한 내용은 생성자에 있습니다. (setAccessible (true)를 사용하여)해야 할 필요가 있다면 반사를 사용하여 생성자를 호출 할 수 있습니다. 어떤 이유로 든 호출 할 수없는 경우 클래스의 바이트 코드를 읽어 각 필드를 초기화 할 것인지 결정할 수 있습니다.(이것은 실질적으로 생성자를 호출하는 것과 동일하지만 완전한 제어권을가집니다.)
바이트 코드를 직접 파싱 할 수 있습니다. 간단한 클래스의 경우 너무 힘들어서는 안되지만 다음과 같은 클래스를 상상해보십시오 :
public class Foo {
private Bar field = OtherClass.someStaticMethod();
}
그러면 훨씬 더 어려울 것입니다.
더 많은 것을 우리에게주세요. 너 정확히 뭘 하려구? – ApprenticeHacker
그럼 간접적으로 인스턴스화해야합니다 :-) – nowaq