class 객체로 관리하는 클래스와 인터페이스의 메타 정보를 프로그램에서 읽고 수정하는 것
메타 정보 : 구분할 수 있는 정보 (패키지 정보, 타입 정보, 생성자, 필드, 메소드 정보 등)
메타 데이터 : 데이터를 정의하고 기술하는 데이터로 데이터에 대한 데이터이다.
유연하게 코드를 작업할 수 있는 기능!
리플렉션을 이용해 객체를 제작하는 것을 주입이라고 함
리플렉션 활용하는 것이 좋음
Class 클래스의 메소드
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Class.html

package ch12.sec11.exam01;
public class Vehicle {
//메소드 선언
public Vehicle() {
System.out.println("기본 생성자");
}
public void run() {
System.out.println("차량이 달립니다.");
}
}
package ch12.sec11.exam01;
public class Bus extends Vehicle {
public Bus() {
System.out.println("기본생성자 Bus() 호출");
}
//메소드 재정의(오버라이딩)
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
package ch12.sec11.exam01;
public class Taxi extends Vehicle {
public Taxi() {
System.out.println("기본생성자 Taxi() 호출");
}
//메소드 재정의(오버라이딩)
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
package ch12.sec11.exam01;
public class Truck extends Vehicle{
public Truck() {
System.out.println("기본 생성자 Truck() 호출");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("트럭이 달립니다");
}
public double add(double a, int b) {
System.out.println("a= " + a);
System.out.println("b= " + b);
return a+b;
}
public double minus(double a, int b) {
System.out.println("a= " + a);
System.out.println("b= " + b);
return a-b;
}
}
package ch12.sec11.exam01;
public class Car {
}
package ch12.sec11.exam01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class GetClassExam {
// throws Exception : 예외를 던짐
public static void main(String[] args) throws Exception{
// 매개값이 2개가 아니면
// 매개값 측정하는 구문을 맨 앞에 둬야함
if(args.length != 2) {
System.out.println("실행에 필요한 정보 부족");
System.exit(0);
}
// 기본 생성자 입력
// 매개변수를 쓰거나 클래스 이름을 String 형식으로 풀네임으로 적기
Class clazz = Class.forName(args[0]);
// 기본 생성자 정보를 얻는 것
// java.lang 패키지에 속해있는 클래스로 사용시 import 해주기
Constructor con = clazz.getConstructor();
// 기본 생성자 호출
Object obj = con.newInstance();
// try : 예외가 생길 수 있는 구문들을 넣어줌
try {
// getMethod() : 해당 클래스의 메소드명을 입력하여 해당 메소드를 찾음
// 메소드의 매개변수가 있을 경우 뒤에 인자를 입력하기
// int.class : 매개변수 int를 가지는 해당 클래스(객체)
// Method 클래스 : java.lang 소속이기 때문에 사용시 import 해주기
Method run = clazz.getMethod(args[1], double.class, int.class);
// 메소드가 있으면
if(run != null) {
// .invoke() : 해당 클래스의 메소드를 실행
Object result = run.invoke(obj, 20.5, 10);
System.out.println("result= " + result);
}
// 예외 발생 경우에 에러메세지 출력
} catch(Exception e){
System.out.println(e.getMessage());
}
}
}



