English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 반영을 학습하겠습니다. 이는 Java 프로그래밍의 특성 중 하나로, 클래스, 메서드 등을 확인하고 수정할 수 있습니다.
Java에서는 반영을 통해 실행 중에 클래스, 인터페이스, 생성자, 메서드, 필드 등을 확인하고操作할 수 있습니다.
Java 반영을 학습하기 전에, Class라는 이름의 Java 클래스를 이해해야 합니다.
Java에는 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 패키지는 클래스 멤버를操作할 수 있는 클래스를 제공합니다. 예를 들어,
메서드 클래스 - 클래스의 메서드에 대한 정보를 제공합니다
필드 클래스 - 클래스의 필드에 대한 정보를 제공합니다
생성자 클래스 - 클래스의 생성자에 대한 정보를 제공합니다
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
像字段一样,我们可以使用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
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