2017-02-24 1 views
0

내가 아는 한, 내가하려고하는 것은 불가능합니다. 그러나 여기에 3 개의 작은 코드 샘플이 있습니다. 첫 번째 것은 현재 가지고있는 것이고, 두 번째는 내가 갖고 싶은 것이고, 세 번째는 달성 할 수있는 방법입니다. 반사. 두 번째 예제에 더 가까워 지도록 코드를 재구성하는 방법이 있는지 궁금합니다. 몇 가지 가정이 있습니다. 여기에서 사용되는 각 클래스에는 생성자가 하나만 있으며 필요한 객체가 정확히 구분됩니다. Object []는 런타임에 모든 것을 모르기 때문입니다. 리플렉션을 사용하지 않고 클래스 객체 인스턴스화

Object o; Object[] params; String myString; 
HashMap<String, Class<?>> map; 
o = new map.get(myString)(params); //Obviously doesnt work 
실제로 위의 거짓말

3.

Object o; Object[] params; String myString; 
HashMap<String, Class<?>> map; 
o = map.get(myString).getConstructors()[0].newInstance(params); 

2.

Object o; Object[] params; String myString; 
switch(myString){ 
case "ClassA": o = new ClassA(params); 
case "ClassB": o = new ClassB(params); 
//ETC 
} 

1.

. 지금 당장 가지고있는 것은 1이 아니라 3입니다. 모든 클래스 이름을 하드 코드 할 수 없기 때문에 1을 가질 수 없습니다. 그래도 2을 갖고 싶습니다. 어떤 제안?

일부 해명은 : 예제

해시 맵 23는 클래스 이름의 문자열 표현, 실제 클래스 객체의 쌍을 포함하고 있습니다.

또한 런타임시 (분명히) 채워집니다. 즉 위의 코드를 실행하기 전에 인스턴스화하려는 모든 가능한 클래스를 알고 있지만 그 중 일부는 하드 코딩 할 수 없습니다. 파일로로드됩니다. .

+0

왜 원하니? 'map'에 무엇이 있습니까? –

+3

반사를 사용하지만 반사를 사용하지 않고 인스턴스화하는 것은 복잡합니다. – davidxxx

+0

모든 클래스 이름을 하드 코딩 할 수 없다면 '2'를 가질 수 없으며 모든 문자열을 어디에서 가져와야합니까? 아니면 오해인가요? 코드에서 가능한 한 모든 클래스 (ClassA, ClassB ...)에 대해 한 지점에서 알 수 있습니까? –

답변

2

알려 주시면 죄송합니다.
Java에서는 불가능합니다.

리바운드를 사용하지만 리플렉션을 사용하지 않고 클래스를 인스턴스화 할 수있는 2 진 원칙을 따르지 않는 자신의 언어를 작성하십시오. 행운을 빕니다.

+0

음, 그 말은 내 문제를 설명하기위한 것이 었습니다. 실제 문제는 엔티티의 모듈 식로드를 허용하면서 리플렉션을 피하기 위해 코드를 재구성 할 수 있어야하고 어떻게해야 하는가입니다. – user2065501

+0

나는 그것이 불가능하다고 생각한다. 중앙 Maven 저장소 (숨기기 위해)에서 호스트하고 호스트하는 자체 도구를 작성할 수 있습니다. –

+0

실제로 나는 위의 모든 주석을 고려하여 코드를 재구성 할 수있는 방법을 찾았을 것이라고 생각합니다. HashMap에서 엔티티의 문자열 이름과 "EntityFactory"를 저장합니다.이 클래스는 그 특정 엔티티의 새 인스턴스를 리턴하십시오. 따라서 새로운 엔티티를 추가하는 것은 "등록"메소드를 호출하는 것만 큼 쉽습니다 : 'bla.registerEntity ("EntityType", new EntityFactory() {@ public Entity create (Object [] params)를 오버라이드합니다. {new EntityType ((int) params 예를 들어 이름이있는 인스턴스가 필요할 때 간단히 다음과 같이 할 수 있습니다 :'map.get (name) .create (params)':)! – user2065501

관련 문제