JDK11
본문의 소스코드를 바꾸지 않고 다른 객체로 바꾸는 방법 중 한가지이다
이해를 위한 간단한 예제이다
package useInterface.ex1;
public class A {
private X x; // has ~ a 관계
public void setX(X x) {
this.x = x;
}
public void print() {
System.out.println(this.x.total());
}
}
package useInterface.ex1;
public class B implements X {
@Override
public int total() {
return 30;
}
}
package useInterface.ex1;
public class C implements X {
@Override
public int total() {
return 50;
}
}
같은 패키지 안에 setting.txt ( 이름무관 ) 생성
내용 : 사용할 클래스를 패키지명과 함께 작성
useInterface.ex1.C
여기서 부터 적용될 소스코드
package useInterface.ex1;
import java.io.FileInputStream;
import java.util.Scanner;
public class Program {
public static void main(String[] args) throws Exception {
// 메모장에는 생성해야할 객체의 이름을 적어놓는다, 외부파일로 빼낸다
// 이렇게 코드를 작성하면 본문의 코드를 수정할 필요가 없으며
// 향후 어노테이션 | xml 파일으로도 이러한 효과를 줄 수 있다
// root경로부터 setting.txt의 위치
FileInputStream fis = new FileInputStream("src/useInterface/ex1/setting.txt");
Scanner sc = new Scanner(fis); // 파일을 읽을 객채
String className = sc.nextLine(); // sc로 입력된 문장
System.out.println(className); // 확인
fis.close(); // 메모리누수 방지
sc.close(); // 메모리누수 방지
A a = new A(); // 인스턴스를 담을 객체
// B b = new B(); // B라는 클래스 명을 소스코드를 수정하지 않고 어떻게 바꿀 것인가
// a.setX(b); // 클래스의 바꿀때마다 코드를 고쳐주어야한다.
// 모든 타입을 받아드린다
Class<? extends Object> clazz
= Class.forName(className); // 클래스의 정보를 가져오는 구조체
X x = (X) clazz.getDeclaredConstructor().newInstance(); // 인스턴스 생성
a.setX(x);
a.print();
}
}728x90
'Java' 카테고리의 다른 글
| [이클립스] Maven 설정 (0) | 2023.07.28 |
|---|---|
| [Data Structure] BST (0) | 2023.07.24 |
| The superclass "javax.servlet.http.HttpServlet", determined from the Dynamic Web Module facet version (4.0), was not found on the Java Build Path (0) | 2023.05.30 |
| Tomcat9 에러 (Windows) (0) | 2023.05.30 |
| 용어 정리 (0) | 2023.05.30 |