2011-04-01 2 views
3

세계! 클래스의 이름으로 Object를 인스턴스화해야합니다. 이런 식으로 할 수 있다는 것을 알고 있습니다.불완전한 클래스 이름에서 인스턴스화 된 객체를 얻는 방법?

MyObject myObject = null; 
try { 
    Constructor constructor = Class.forName("fully.qualified.class.name" ).getConstructor(); // Get the constructor without parameters 
    myObject = (MyObject) constructor.newInstance(); 
} catch (Exception e) { 
    e.printStackTrace(); 
}  

문제는 클래스 이름이 완전하지 않습니다. 짧은 이름 만 알면 완전한 이름을 얻을 수있는 방법이 있습니까?

+0

클래스가 이미로드 되었습니까? B/c 그러면로드 된 클래스를 모두 나열하고 비교할 수 있습니다.하지만 필자는이 클래스가 필요한 이유는 무엇입니까? 어쩌면 더 높은 수준의 문제에 대한 더 나은 해결책이 있습니다. –

답변

2
MyObject myObject = null; 
for (Package p : Package.getPackages()) { 
    try { 
     myObject = Class.forName(p.getName() + "." + className).newInstance(); 
     break; 
    } catch (ClassNotFoundException ex) { 
     // ignore 
    } 
} 

Package.getPackages() 전화는 당신에게 현재의 클래스의 클래스 로더 과 그 조상에 알려진 모든 패키지를 제공 할 것입니다.

경고 : 반복적으로 예외를 던지고 잡기 때문에 비용이 많이 듭니다. 테스트하여 속도를하는 것이 가능할 수있다 :

this.getClass().getClassLoader().findResource(binaryClassName) != null 

Class.forName(...) 또는 동등한를 호출하기 전에.

+0

좋습니다. 감사합니다. FYI, p.getName()과 className 사이에 누락 된'+ "."이 있습니다. – tunnuz

+0

감사합니다. 해결했습니다. –

1

패키지 검색 경로로 반복해서 사용하십시오. ;)

String[] packages = ...; 
String className = ...; 
MyObject myObject = null; 
for(String p : packages) 
    try { 
    myObject = Class.forName(p + '.' + className).newInstance(); 
    break; 
    } catch (Exception ignored) { 
    } 
+0

이것은 특정 예외 (예 : ClassNotFoundEx)를 잡을지라도 요청한대로 정확하게 수행 할 수있는 유일한 방법 일 수 있습니다. 다른 것을 숨기고 싶지는 않습니다. 문제는 ... –

+0

@ Java Drinker, 이것은 사실입니다. 실패한 생성자에 부작용이있는 경우에도 부작용이 발생할 수 있습니다. 이 방법으로 newInstance()를 사용하는 단점 중 하나는 CNFE도 포기할 수 있다는 것입니다. (꽤 신경이 쓰이지 만) 즉,이 newInstance()는 검사 된 예외를 래핑하지 않습니다. –

관련 문제