나는 인스턴스를 필요로하는 250 개 이상의 하위 클래스가 있으며 거기에 앉아서 수줍음을 붙여 new Class();
번 250 번 붙여 넣을 수 없습니다. 어쨌든 Reflection을 사용하여 수업의 기초를 마련합니까? 인스턴스를 만들 때 생성자가 필요하지 않습니다. 감사합니다. .모든 하위 클래스의 인스턴스를 만드는 방법
답변
난 정말 당신을 undesrtand하지 않지만, 그런 것 같아요 (테스트하지)하려고 :
public class Test {
public static void main(String[] args) {
Class[] classes = new Class[]{Class1.class, Class2.class, Class3.class};
for (Class cls : classes) {
Object myObject = cls.newInstance();
-------^^^^^^^^-------
}
}
}
봐
Creating New Class Instances에서 편집 : 는 http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String)
Class.forName("mypackage.MyClassname");
그 정도는 알고 있지만 클래스 이름없이 모든 것을해야합니다. 모든 clases에 대해 루프를 실행하고 해당 수퍼 클래스가 다른 클래스 (Class.getSuperclass())인지 확인한 다음 인스턴스를 확인해야합니다. – user1681891
다음과 같이 할 수 있습니다.
Class instantiableClass = Class.forName("package.subpackage.ClassName");
Object instance = instantableClass.newInstance();
클래스에 기본 생성자 또는 public 0 args 생성자 만있는 경우에만 작동합니다. 필요한 경우 코드가 반복되거나 일반화되거나 재현 될 수 있습니다.
더 일반적인 해결 방법은 this을 사용하는 것이 왜 가능하지 않은지 이해하는 데 도움이 될 수 있습니다. 당신은 당신이 알고있는 모든 수업에서 원하는 것을 할 수 있고, 그들의 이름을 알고 있거나, 어떤 출처에서든지 그들의 이름에 접근 할 수 있으며, 어떤 식 으로든 최소한의 정보를 제공받을 수 있습니다.
하지만 그 클래스에 대한 지식이 없으면 거의 불가능합니다. 현재 클래스 경로에있는 모든 클래스를 찾은 다음 특정 클래스를 준수하도록 상속 트리를 chceck해야합니다.
: 여기
this.actions = new HashMap<String, Commande>();
ServletContext sc = this.getServletContext();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL res = classLoader.getResource(COMMAND_DIRECTORY);
File[] list = new File(res.getFile()).listFiles();
String className = "";
for (File f : list) {
className = f.getName().replaceAll(".class$", "");
try {
Class<?> classe = Class.forName("org.commandes." + className);
if (classe.getSuperclass() == Commande.class) {
Commande c = (Commande) classe.newInstance();
this.actions.put(c.getName(), c);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
을 COMMAND_DIRECTORY 나를위한 조직/명령입니다.
이것이 올바른 방법인지는 모르겠지만 서블릿에 명령 디자인 패턴 (구현 된 플러그인과 유사 함)을 구현하는 방법을 찾은 유일한 방법입니다.
먼저 get all the subclasses이 필요합니다. 그 특별한 대답은 내가 직접 시험하지는 않았지만 합법적으로 보인다.
그런 다음 전달해야하는 생성자에 대한 매개 변수가있는 경우 클래스를 반복하고 Class.newInstance
(인수 없음 생성자) 또는 Class.getConstructor
및 Constructor.newInstance
을 사용하여 인스턴스를 만듭니다. 최종 코드는 다음과 같습니다.
이렇게하면 하위 클래스를 가져 와서 반복하고 각각의 인스턴스를 만듭니다. 여기에 몇 가지 예외가 있습니다. 당신도 캐스팅을해야 할 수도 있습니다.
편집 : 위의 대답을 보면 가짜 클래스 로딩이 발생할 수 있습니다.서브 클래스 like this instead 당신의 세트를 만듭니다
Reflections reflections = new Reflections(...); //see in other use cases
Set<String> subTypeFqns = reflections.getStore().getSubTypesOf(SomeClass.class.getName());
Set<Class<?>> subTypes = new HashSet<Class<?>>();
for (String fqn : subTypeFqns) {
subTypes.add(Class.forName(fqn));
}
을 다음이 줄을 :
for (Class<? extends SubType> subType : subTypes) {
someTypes.add(subType.newInstance());
}
이되기 :
for (Class<?> subType : subTypes) {
someTypes.add((SomeType) subType.newInstance());
}
하위 서브 클래스도 얻을 수 있으므로 하위 클래스가 필요 없으면'subType.getSuperclass(). equals (SomeType.class)'를 사용하여 반복 할 때 필터링 할 수 있습니다. – Brian
- 1. 클래스의 인스턴스를 만드는 다른 방법
- 2. 일반 ArrayList에서 단일 하위 클래스의 모든 인스턴스를 유지하는 방법
- 3. RestKit 0.10.1 : NSManagedObject 하위 클래스의 새 인스턴스를 만드는 방법은 무엇입니까?
- 4. 파이썬에서 다른 클래스의 클래스 인스턴스를 만드는 방법
- 5. 다른 메서드에서 클래스의 인스턴스를 만드는 방법
- 6. asp.net에서 클래스의 인스턴스를 한 번만 만드는 방법
- 7. 값이 있거나없는 클래스의 인스턴스를 만드는 방법
- 8. Class.forName의 결과로 제네릭 클래스의 인스턴스를 만드는 방법
- 9. 현재 모듈에서 클래스의 모든 인스턴스를 얻는 방법
- 10. 한 클래스의 인스턴스를 다른 클래스의 인스턴스로 만드는 방법
- 11. 하위 클래스의 객체 인스턴스를 생성하기위한 디자인 패턴
- 12. 기본 클래스의 모든 인스턴스를 하위 클래스 C로 바꿉니다.
- 13. 클래스의 인스턴스를 반환하는 방법?
- 14. 클래스의 인스턴스를 얻는 방법
- 15. CustomLineCap 클래스의 인스턴스를 serialize하는 방법
- 16. UIView 하위 클래스의 프레임을 불변으로 만드는 방법
- 17. 예나에서 한 클래스의 인스턴스를 다른 클래스의 인스턴스로 만드는 방법은 무엇입니까?
- 18. PHP에서 클래스의 모든 하위 클래스를 얻는 방법
- 19. 클래스의 두 인스턴스를 비교하는 방법
- 20. XAML에서 클래스의 인스턴스를 만드는 방법은 무엇입니까?
- 21. 스레드를 만드는 클래스의 여러 인스턴스를 인스턴스화하는 중 ... ...?
- 22. C에서 개체의 인스턴스를 만드는 방법 #
- 23. QWebFrame 인스턴스를 만드는 방법
- 24. Actionscript 3.0 클래스의 모든 인스턴스를 가져 오겠습니까?
- 25. Xcode/iOS : 주어진 클래스의 모든 인스턴스를 반복합니까?
- 26. 객관적인 C 클래스의 모든 인스턴스를 가져 오시겠습니까?
- 27. 다른 클래스의 인스턴스를 만드는 클래스에 대한 참조를 얻는 방법 (가능한)
- 28. C#에서 보호 생성자가 클래스의 인스턴스를 만드는 방법
- 29. 구조지도 제네릭 클래스의 모든 인스턴스를 얻는 방법 구조지도에서
- 30. 클래스의 인스턴스를 캐스트로 바꾸는 방법, 모든 참조가 작동하는 동안
우리는이보다 더 많은 정보가 필요합니다. 이러한 인스턴스는 어디에서 생성되어야합니까? 일부 코드가 도움이 될 것입니다. – Keppil
@Keppil 인스턴스가 없으므로 인스턴스를 만들어야합니다. 내 프로그램을 시작할 때 만들어야합니다. – user1681891
나는 그 클래스의 이름을 알고 있다고 가정하고 그 클래스의 전체 목록과 생성하려는 인스턴스의 수를 알고 있습니까? –