English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 프로세스 제어

Java 배열

Java 대상 객체(I)

Java 대상 객체(II)

Java 대상 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 반영 (Reflection)

이 튜토리얼에서는 반영을 학습하겠습니다. 이는 Java 프로그래밍의 특성 중 하나로, 클래스, 메서드 등을 확인하고 수정할 수 있습니다.

Java에서는 반영을 통해 실행 중에 클래스, 인터페이스, 생성자, 메서드, 필드 등을 확인하고操作할 수 있습니다.

Java 클래스 이름 Class

Java 반영을 학습하기 전에, Class라는 이름의 Java 클래스를 이해해야 합니다.

Java에는 Class라는 클래스가 있으며, 이 클래스는 실행 중에 객체와 클래스에 대한 모든 정보를 유지합니다.

Class 객체는 특정 클래스의 속성을 설명합니다. 이 객체는 반영을 수행하는 데 사용됩니다.

Class의 이름을 가진 클래스의 객체 생성

Class 객체를 생성할 수 있습니다:

  • forName() 메서드 사용

forName()는 문자열 파라미터(클래스 이름)을 받아들여 Class 객체를 반환합니다. 반환된 객체는 문자열로 지정된 클래스를 참조합니다. 예를 들어,

Class Dog {    }
Class c1 = Class.forName("Dog");
  • getClass() 메서드 사용

 getClass() 메서드는 특정 클래스의 객체를 사용하여 새로운 객체 Class를 생성합니다. 예를 들어,

Dog d1 = new Dog()
Class c1 = d1.getClass();
  • 사용.class

또한 사용할 수 있습니다.class확장자를 사용하여 Class 객체를 생성합니다. 예를 들어,

Class c1 = Dog.class;

Class 객체를 생성한 후, 이 객체를 사용하여 반영을 수행할 수 있습니다.

인터페이스 가져오기

Class의 getInterfaces() 메서드를 사용하여 클래스가 구현한 인터페이스 정보를 수집할 수 있습니다. 이 메서드는 인터페이스 배열을 반환합니다.

예제: 인터페이스 가져오기

import java.lang.Class;
import java.lang.reflect.*;
interface Animal {
   public void display();
}
interface Mammal {
   public void makeSound();
}
class Dog implements Animal, Mammal {
   public void display() {
      System.out.println("I am a dog.");
   }
   public void makeSound() {
      System.out.println("Bark bark");
   }
}
class ReflectionDemo {
  public static void main(String[] args) {
      try {
          //Dog 클래스의 객체 생성
          Dog d1 = new Dog();
          //getClass() 사용하여 Class 객체 생성
          Class obj = d1.getClass();
        
          //Dog가 구현한 인터페이스를 찾습니다
          Class[] objInterface = obj.getInterfaces();
          for(Class c : objInterface) {
              //인터페이스 이름 출력
              System.out.println("인터페이스 이름: "} + c.getName());
          }
      }
      catch(Exception e) {
          e.printStackTrace();
      }
   }
}

출력 결과

Interface Name: Animal
Interface Name: Mammal

상위 클래스와 접근수식 가져오기

Class의 getSuperclass() 메서드는 특정 클래스의 상위 클래스에 대한 정보를 가져올 수 있습니다.

또한, Class는 getModifier() 메서드를 제공하며, 이 메서드는 class의修饰기호를 정수 형식으로 반환합니다.

예제: 상위 클래스와 접근수식 가져오기

import java.lang.Class;
import java.lang.reflect.*;
interface Animal {
   public void display();
}
public class Dog implements Animal {
   public void display() {
       System.out.println("I am a dog.");
   }
}
class ReflectionDemo {
   public static void main(String[] args) {
       try {
           //Dog 클래스의 객체 생성
           Dog d1 = new Dog();
           //getClass() 사용하여 Class 객체 생성
           Class obj = d1.getClass();
           //Dog의 접근수식을 정수 형식으로 가져옵니다
           int modifier = obj.getModifiers();
           System.out.println("조정자: " + Modifier.toString(modifier));
           //Dog의 상위 클래스를 찾습니다
           Class superClass = obj.getSuperclass();
           System.out.println("Superclass: ") + superClass.getName());
       }
       catch(Exception e) {
           e.printStackTrace();
       }
   }
}

출력 결과

조정자: public
Superclass: Animal

반영 필드, 메서드 및 생성자

java.lang.reflect 패키지는 클래스 멤버를操作할 수 있는 클래스를 제공합니다. 예를 들어,

  • 메서드 클래스 - 클래스의 메서드에 대한 정보를 제공합니다

  • 필드 클래스 - 클래스의 필드에 대한 정보를 제공합니다

  • 생성자 클래스  - 클래스의 생성자에 대한 정보를 제공합니다

Java 반영과 필드

 Field 클래스가 제공하는 다양한 메서드를 사용하여 클래스의 다른 필드를 확인하고 수정할 수 있습니다.

  • getFields() - 클래스 및 상속된 클래스의 모든 공개 필드를 반환합니다

  • getDeclaredFields()  - 클래스의 모든 필드를 반환합니다

  • getModifier() - 필드의修饰기호를 정수 형식으로 반환합니다

  • set(classObject,value) - 지정된 값을 사용하여 필드의 값을 설정합니다

  • get(classObject) - 필드의 값을 가져옵니다

  • setAccessible(boolean) - 使私有字段可访问

주의:필드 이름을 알면 사용할 수 있습니다.

  • getField("fieldName") - 클래스에서 이름이fieldName의 공개 필드.

  • getDeclaredField("fieldName") - 클래스에서 이름이fieldName의 필드.

예제: 공개 필드 접근

import java.lang.Class;
import java.lang.reflect.*;
class Dog {
  public String type;
}
class ReflectionDemo {
  public static void main(String[] args) {
     try{
         Dog d1 = new Dog();
          //Class 객체 생성
         Class obj = d1.getClass();
        //操作Dog类的公共字段type
         Field field1 = obj.getField("type");
        //设置字段的值
         field1.set(d1, "labrador");
        //通过转换为字符串来获取字段的值
         String typeValue = (String)field1.get(d1);
         System.out.println("type: ", + typeValue);
         //获取类型的访问修饰符
         int mod1 = field1.getModifiers();
         String modifier1 = Modifier.toString(mod1);
         System.out.println("조정자: " + modifier1);
         System.out.println(" ");
     }
     catch(Exception e) {
         e.printStackTrace();
     }
  }
}

출력 결과

type: labrador
조정자: public

示例:访问私有字段

import java.lang.Class;
import java.lang.reflect.*;
class Dog {
 private String color;
}
class ReflectionDemo {
public static void main(String[] args) {
   try {
      Dog d1 = new Dog();
      //创建类Class对象
      Class obj = d1.getClass();
      //访问私有字段
      Field field2 = obj.getDeclaredField("color");
     
      //使私有字段可访问
      field2.setAccessible(true);
      //设置color值
      field2.set(d1, "brown");
      // 将类型转换为字符串以获取值
      String colorValue = (String)field2.get(d1);
      System.out.println("color: ", + colorValue);
      //获取color的访问修饰符
      int mod2 = field2.getModifiers();
      String modifier2 = Modifier.toString(mod2);
      System.out.println("modifier: ", + modifier2);
   }
   catch(Exception e) {
      e.printStackTrace();
   }
 }
}

출력 결과

color: brown
modifier: private

Java reflection and method

像字段一样,我们可以使用Method类提供的各种方法来检查类的不同方法。

  • getMethods() - 返回该类及其超类的所有公共方法

  • getDeclaredMethod() - 返回该类的所有方法

  • getName() - 返回方法的名称

  • getModifiers() - 以整数形式返回方法的访问修饰符

  • getReturnType() - 返回方法的返回类型

示例:方法反射

import java.lang.Class;
import java.lang.reflect.*;
class Dog {
   public void display() {
      System.out.println("I am a dog.");
   }
   protected void eat() {
      System.out.println("I eat dog food.");
   }
   private void makeSound() {
      System.out.println("Bark Bark");
   }
}
class ReflectionDemo {
   public static void main(String[] args) {
      try {
          Dog d1 = new Dog();
          //Class 객체를 생성합니다
          Class obj = d1.getClass();
          
          //getDeclaredMethod()를 사용하여 모든 메서드를 가져옵니다
          Method[] methods = obj.getDeclaredMethods();
          //메서드 이름을 가져옵니다
          for(Method m : methods) {
               
             System.out.println("메서드 이름: "); + m.getName());
              
             //메서드의 접근 지정자를 가져옵니다
             int modifier = m.getModifiers();
             System.out.println("조정자: " + Modifier.toString(modifier));
              
             //메서드의 반환 타입을 가져옵니다
             System.out.println("Return Types: "); + m.getReturnType());
             System.out.println(" ");
          }
       }
       catch(Exception e) {
           e.printStackTrace();
       }
   }
}

출력 결과

메서드 이름: display
조정자: public
Return type: void
메서드 이름: eat
지정자: protected
반환 타입: void
메서드 이름: makeSound
조정자: private
반환 타입: void

Java 반영 및 생성자

Constructor 클래스가 제공하는 다양한 메서드를 사용하여 클래스의 다른 생성자를 확인할 수 있습니다.

  • getConstructors() - 해당 클래스의 모든 공개 생성자와 그 클래스의 상위 클래스를 반환합니다

  • getDeclaredConstructor() -모든 생성자를 반환합니다

  • getName() - 생성자의 이름을 반환합니다

  • getModifiers() - 생성자의 접근 지정자를 정수로 반환합니다

  • getParameterCount() - 생성자의 매개변수 개수를 반환합니다

예제: 생성자 반영

import java.lang.Class;
import java.lang.reflect.*;
class Dog {
   public Dog() {
      
   }
   public Dog(int age) {
      
   }
   private Dog(String sound, String type) {
      
   }
}
class ReflectionDemo {
   public static void main(String[] args) {
      try {
           Dog d1 = new Dog();
           Class obj = d1.getClass();
           //getDeclaredConstructor()를 사용하여 클래스의 모든 생성자를 가져옵니다
           Constructor[] constructors = obj.getDeclaredConstructors();
           for(Constructor c : constructors) {
               //생성자 이름을 가져오기
               System.out.println("생성자 이름: " + c.getName());
               //생성자의 접근 조정자를 가져오기
               int modifier = c.getModifiers();
               System.out.println("조정자: " + Modifier.toString(modifier));
               //생성자에서의 파라미터 개수를 가져오기
               System.out.println("파라미터 개수: " + c.getParameterCount());
          }
       }
       catch(Exception e) {
           e.printStackTrace();
       }
    }
}

출력 결과

생성자 이름: Dog
조정자: public
파라미터 개수: 0
생성자 이름: Dog
조정자: public
파라미터 개수: 1
생성자 이름: Dog
조정자: private
파라미터 개수: 2