산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

Java Reflection API 마스터하기: 실전 가이드와 코드 예제

Java에서 리플렉션이란?

Java 리플렉션은 런타임에 클래스의 모든 능력을 분석하고 수정하는 과정입니다. Java Reflection API는 클래스와 그 멤버(필드, 메서드, 생성자 등)를 런타임에 조작하는 데 사용됩니다.

Java 리플렉션 API의 한 가지 장점은 클래스의 private 멤버도 조작할 수 있다는 것입니다.

java.lang.reflect 패키지는 리플렉션을 구현하기 위한 많은 클래스를 제공합니다. java.lang.Class 클래스의 메서드는 특정 클래스의 완전한 메타데이터를 수집하는 데 사용됩니다.

이 튜토리얼에서 배울 내용:

java.lang.reflect 패키지의 클래스들

다음은 리플렉션 구현을 위한 java.lang.reflect 패키지의 다양한 Java 클래스들입니다:

java.lang.Class에서 사용되는 메서드들

클래스에 대한 완전한 정보 얻기

클래스의 변수, 메서드, 생성자에 대한 정보를 얻으려면 클래스 객체를 생성해야 합니다.

Java Reflection API 마스터하기: 실전 가이드와 코드 예제

public class Guru99ClassObjectCreation {
    public static void main (String[] args) throws ClassNotFoundException {
        // 1 - Class.forName() 메서드 사용
        Class c1 = Class.forName("Guru99ClassObjectCreation");
        // 2 - getClass() 메서드 사용
        Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
        Class c2 = guru99Obj.getClass();
        // 3 - .class 사용
        Class c3 = Guru99ClassObjectCreation.class;
    }
}
  • "class" 클래스 객체 생성하는 다양한 방법:
  • 예제 1: 클래스 메타데이터 얻기

    다음 예제는 클래스 이름, 슈퍼클래스 이름, 구현된 인터페이스, 클래스의 접근 제어자 등 메타데이터를 얻는 방법을 보여줍니다.

    아래 Guru99Base.class라는 클래스의 메타데이터를 얻겠습니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    1. 클래스 이름: Guru99Base
    2. 접근 제어자: public, abstract
    3. 구현된 인터페이스: Serializable, Cloneable
    4. 명시적으로 클래스를 확장하지 않았으므로 슈퍼클래스: java.lang.Object

    아래 클래스는 Guru99Base.class의 메타데이터를 얻고 출력합니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    import java.lang.reflect.Modifier;
    public class Guru99GetclassMetaData {
        public static void main (String [] args) throws ClassNotFoundException {
            // Guru99Base.class의 Class 객체 생성
            Class<Guru99Base> guru99ClassObj = Guru99Base.class;
            // 클래스 이름 출력
            System.out.println("Name of the class is : " + guru99ClassObj.getName());
            // 슈퍼클래스 이름 출력
            System.out.println("Name of the super class is : " + guru99ClassObj.getSuperclass().getName());
            // getInterfaces() 메서드로 구현된 인터페이스 목록을 Class 배열로 얻기
            Class[] guru99InterfaceList = guru99ClassObj.getInterfaces();
            // foreach 루프로 구현된 인터페이스 출력
            System.out.print("Implemented interfaces are : ");
            for (Class guru99class1 : guru99InterfaceList) {
                System.out.print(guru99class1.getName() + " ");
            }
            System.out.println();
            // getModifiers()와 Modifier.toString()으로 접근 제어자 얻기
            int guru99AccessModifier = guru99ClassObj.getModifiers();
            // 접근 제어자 출력
            System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier));
        }
    }
    1. getName 메서드로 클래스 이름 출력
    2. getSuperClass().getName()으로 슈퍼클래스 이름 출력
    3. 구현된 인터페이스 이름 출력
    4. 클래스가 사용한 접근 제어자 출력

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    예제 2: 변수 메타데이터 얻기

    다음 예제는 변수 메타데이터를 얻는 방법을 보여줍니다:

    여기에 몇 개의 변수를 가진 Guru99VariableMetaData.class라는 클래스를 만듭니다:

    package guru;
    public class Guru99VariableMetaData {
        public static int guru99IntVar1=1111;
        static int guru99IntVar2=2222;
        static String guru99StringVar1="guru99.com";
        static String guru99StringVar2="Learning Reflection API";
    }
    위 클래스의 변수 메타데이터 얻는 단계:
    1. 위 클래스의 클래스 객체 생성:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();
      Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. getFields() 또는 getDeclaredFields() 메서드로 필드 배열 형태의 메타데이터 얻기:
      Field[] guru99Field1 = guru99ClassObjVar.getFields();
      Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();

    getFields() 메서드는 지정된 클래스와 슈퍼클래스의 public 변수 메타데이터를 반환합니다.

    getDeclaredFields() 메서드는 지정된 클래스의 모든 변수 메타데이터만 반환합니다.

    1. public String getName() 메서드로 변수 이름 얻기
    2. public Class getType() 메서드로 변수 데이터 타입 얻기
    3. public xxx get(Field) 메서드로 변수 값 얻기. 여기서 xxx는 가져오고 싶은 값의 타입(byte, short 등)일 수 있음
    4. getModifier()와 Modifier.toString(int i) 메서드로 변수 접근 제어자 얻기

    여기서 Guru99VariableMetaData.class에 있는 변수들의 메타데이터를 얻는 클래스를 작성합니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    package guru;
    import java.lang.reflect.Field;
    public class Guru99VariableMetaDataTest {
        public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
            // Guru99VariableMetaData.class의 Class 객체 생성
            Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();
            Class guru99ClassObjVar = guru99ClassVar.getClass();
            // Guru99VariableMetaData 클래스의 모든 필드 메타데이터 얻기
            Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields();
            // 지정된 클래스의 변수 이름, 데이터 타입, 접근 제어자, 값 출력
            for(Field field : guru99Field1) {
                System.out.println("Variable name : " + field.getName());
                System.out.println("Datatypes of the variable :" + field.getType());
                int guru99AccessModifiers = field.getModifiers();
                System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers));
                System.out.println("Value of the variable : " + field.get(guru99ClassVar));
                System.out.println();
                System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
            }
        }
    }
    1. Guru99VariableMetaData.class의 클래스 객체 생성
    2. 필드 배열 형태로 모든 변수 메타데이터 얻기
    3. Guru99VariableMetaData.class의 모든 변수 이름 출력
    4. Guru99VariableMetaData.class의 모든 변수 데이터 타입 출력
    5. Guru99VariableMetaData.class의 모든 변수 접근 제어자 출력
    6. Guru99VariableMetaData.class의 모든 변수 값 출력

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    예제 3: 메서드 메타데이터 얻기

    다음 예제는 메서드 메타데이터를 얻는 방법을 보여줍니다:

    여기에 몇 개의 메서드를 가진 Guru99MethodMetaData.class라는 클래스를 만듭니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    package guru;
    import java.sql.SQLException;
    public class Guru99MethodMetaData {
        public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException {
            System.out.println("Demo method for Reflextion API");
        }
        public String guru99Search(String searchString) throws ArithmeticException, InterruptedException {
            System.out.println("Demo method for Reflection API");
            return null;
        }
        public void guru99Delete(String deleteString) throws SQLException {
            System.out.println("Demo method for Reflection API");
        }
    }

    위 클래스의 메서드 메타데이터 얻는 단계:

    1. 위 클래스의 클래스 객체 생성:
      Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData();
      Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. getMethods()와 getDeclaredMethods()로 메서드 정보를 Method 배열로 얻기:
      Method[] guru99Method1 = guru99ClassObjVar.getMethods();
      Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();

      getMethods()는 지정된 클래스와 슈퍼클래스의 public 메서드 메타데이터 반환.

      getDeclaredMethods()는 지정된 클래스의 모든 메서드 메타데이터만 반환.

    3. getName() 메서드로 메서드 이름 얻기
    4. getReturnType() 메서드로 메서드 반환 타입 얻기
    5. getModifiers()와 Modifier.toString(int i)로 메서드 접근 제어자 얻기
    6. getParameterTypes()로 메서드 매개변수 타입 얻기 (Class 배열 반환)
    7. getExceptionTypes()로 던져지는 예외 얻기 (Class 배열 반환)

    여기서 Guru99MethodMetaData.class에 있는 메서드들의 메타데이터를 얻는 클래스를 작성합니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    package guru;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    public class Guru99MethodMetaDataTest {
        public static void main (String[] args) {
            // Guru99MethodMetaData.class의 Class 객체 생성
            Class guru99ClassObj = Guru99MethodMetaData.class;
            // getDeclaredMethods()로 클래스의 모든 메서드 메타데이터 얻기
            Method[] guru99Methods = guru99ClassObj.getDeclaredMethods();
            for(Method method : guru99Methods) {
                // 메서드 이름 출력
                System.out.println("Name of the method : " + method.getName());
                // 메서드 반환 타입 출력
                System.out.println("Return type of the method : " + method.getReturnType());
                // 접근 제어자 리스트 얻고 출력
                int guru99ModifierList = method.getModifiers();
                System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList));
                // 메서드 매개변수 얻고 출력
                Class[] guru99ParamList = method.getParameterTypes();
                System.out.print("Method parameter types : ");
                for (Class class1 : guru99ParamList) {
                    System.out.print(class1.getName() + " ");
                }
                System.out.println();
                // 메서드가 던지는 예외 얻고 출력
                Class[] guru99ExceptionList = method.getExceptionTypes();
                System.out.print("Exception thrown by method : ");
                for (Class class1 : guru99ExceptionList) {
                    System.out.print(class1.getName() + " ");
                }
                System.out.println();
                System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
            }
        }
    }
    1. Guru99MethodMetaData.class의 클래스 객체 생성
    2. Method 배열로 모든 메서드 메타데이터 얻기
    3. Guru99MethodMetaData.class에 있는 모든 메서드 이름 출력
    4. Guru99MethodMetaData.class의 메서드 반환 타입 출력
    5. Guru99MethodMetaData.class의 모든 메서드 접근 제어자 출력
    6. Guru99MethodMetaData.class의 메서드 매개변수 타입 출력
    7. Guru99MethodMetaData.class의 메서드가 던지는 예외 출력

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    예제 4: 생성자 메타데이터 얻기

    다음 예제는 생성자 메타데이터를 얻는 방법을 보여줍니다:

    여기에 다른 생성자들을 가진 Guru99Constructor.class라는 클래스를 만듭니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    package guru;
    import java.rmi.RemoteException;
    import java.sql.SQLException;
    public class Guru99Constructor {
        public Guru99Constructor(int no) throws ClassCastException, ArithmeticException {
        }
        public Guru99Constructor(int no, String name) throws RemoteException, SQLException {
        }
        public Guru99Constructor(int no, String name, String address) throws InterruptedException {
        }
    }

    여기서 Guru99Constructor.class에 있는 생성자들의 메타데이터를 얻는 클래스를 작성합니다:

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    package guru;
    import java.lang.reflect.Constructor;
    public class Guru99ConstructorMetaDataTest {
        public static void main (String[] args) {
            // Guru99Constructor.class의 Class 객체 생성
            Class guru99Class = Guru99Constructor.class;
            // Constructor 배열로 모든 생성자 정보 얻기
            Constructor[] guru99ConstructorList = guru99Class.getConstructors();
            for (Constructor constructor : guru99ConstructorList) {
                // 각 생성자 이름 출력
                System.out.println("Constructor name : " + constructor.getName());
                // 각 생성자 접근 제어자 얻고 출력
                int guru99Modifiers = constructor.getModifiers();
                System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers));
                // 매개변수 타입 얻고 출력
                Class[] guru99ParamList = constructor.getParameterTypes();
                System.out.print("Constructor parameter types : ");
                for (Class class1 : guru99ParamList) {
                    System.out.print(class1.getName() + " ");
                }
                System.out.println();
                // 생성자가 던지는 예외 얻고 출력
                Class[] guru99ExceptionList = constructor.getExceptionTypes();
                System.out.println("Exception thrown by constructors : ");
                for (Class class1 : guru99ExceptionList) {
                    System.out.print(class1.getName() + " ");
                }
                System.out.println();
                System.out.println("*******************************************");
            }
        }
    }
    1. Guru99Constructor.class의 클래스 객체 생성
    2. Constructor 배열로 모든 생성자 메타데이터 얻기
    3. Guru99Constructor.class에 있는 모든 생성자 이름 출력
    4. Guru99Constructor.class의 모든 생성자 접근 제어자 출력
    5. Guru99Constructor.class의 생성자 매개변수 타입 출력
    6. Guru99Constructor.class의 생성자가 던지는 예외 출력

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    Java Reflection API 마스터하기: 실전 가이드와 코드 예제

    요약:

    java

    1. Java 익명 내부 클래스 마스터: 정의, 문법, 실전 예제
    2. Java 리플렉션 마스터: 런타임에 클래스, 메서드, 필드 검사 및 조작
    3. Java ObjectInputStream 완전 정복: 역직렬화 실전 가이드
    4. Java ObjectOutputStream 마스터하기: 직렬화, 메서드, 실전 예제
    5. C++ 클래스와 객체: 캡슐화, 생성자/소멸자, 접근 제어 실전 가이드
    6. C# 추상 클래스(Abstract Class) 완벽 가이드: 실전 코드 예제
    7. Java String.charAt() 완전 이해: 문법, 반환타입, 예외, 실전 예제
    8. Java String.endsWith() 마스터: 문자열 접미사 확인 예제
    9. Java BufferedReader로 파일 읽기: 실전 가이드와 예제
    10. 자바 삽입 정렬 알고리즘: 명확한 예제와 단계별 가이드