나는 이런 식으로하고 싶다 :
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
따라서 응용 프로그램 유니버스의 모든 클래스를보고 싶습니다. Animal의 하위 클래스를 찾으면 해당 유형의 새 개체를 만들어 목록에 추가하고 싶습니다. 이를 통해 사물 목록을 업데이트하지 않고도 기능을 추가 할 수 있습니다. 나는 다음을 피할 수 있습니다.
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
위의 접근 방식을 사용하면 Animal을 확장하는 새 클래스를 간단하게 만들 수 있으며 자동으로 선택됩니다.
업데이트 : 2008 년 10 월 16 일 오전 9시 태평양 표준시 :
이 질문은 많은 훌륭한 반응을 가져 왔습니다. 감사합니다. 응답과 연구에서 필자가 실제로하고 싶은 것은 Java에서는 불가능하다는 것을 알았습니다. ddimitrov의 ServiceLoader 메커니즘과 같은 접근 방식이 작동하지만 원하는만큼 무겁기 때문에 문제를 Java 코드에서 외부 구성 파일로 옮길 수 있다고 생각합니다. 업데이트 5/10/19 (11 년 후!) @IvanNik의 답변 org.reflections 에 따라 이것을 도울 수있는 몇 가지 라이브러리가 있습니다 . @Luke Hutchison의 답변 에서 나온 ClassGraph 도 흥미로워 보입니다. 답변에는 몇 가지 가능성이 더 있습니다.
내가 원하는 것을 나타내는 또 다른 방법 : Animal 클래스의 정적 함수는 추가 구성 / 코딩없이 Animal에서 상속되는 모든 클래스를 찾아 인스턴스화합니다. 구성 해야하는 경우 어쨌든 Animal 클래스에서 인스턴스화 할 수도 있습니다. Java 프로그램은 .class 파일의 느슨한 페더레이션이기 때문에 그대로입니다.
흥미롭게도 C #에서는 이것이 사소한 것 같습니다 .