Java 예제가 포함된 Reflection API 튜토리얼
반사란 무엇인가? Java?
Java 리플렉션은 런타임에 클래스의 모든 기능을 분석하고 수정하는 프로세스입니다. 리플렉션 API Java 런타임 시 필드, 메소드, 생성자 등을 포함하는 클래스 및 해당 멤버를 조작하는 데 사용됩니다.
Reflection API의 장점 중 하나 Java 즉, 클래스의 개인 멤버도 조작할 수 있습니다.
java.lang.reflect 패키지는 리플렉션을 구현하기 위해 많은 클래스를 제공합니다. java.lang.Class 클래스의 java.Methods는 특정 클래스의 전체 메타데이터를 수집하는 데 사용됩니다.
java.lang.reflect 패키지의 클래스
다음은 목록입니다 여러 Java 수업 java.lang.package에서 리플렉션을 구현합니다.
- 분야: 이 클래스는 데이터 유형, 액세스 한정자, 변수 이름 및 값과 같은 선언적 정보를 수집하는 데 사용됩니다.
- 방법: 이 클래스는 액세스 한정자, 반환 유형, 이름, 매개변수 유형 및 메소드의 예외 유형과 같은 선언적 정보를 수집하는 데 사용됩니다.
- 건설자: 이 클래스는 생성자의 액세스 한정자, 이름, 매개변수 유형과 같은 선언적 정보를 수집하는 데 사용됩니다.
- 편집: 이 클래스는 특정 액세스 수정자에 대한 정보를 수집하는 데 사용됩니다.
java.lang.Class에서 사용되는 메소드
- 공개 문자열 getName(): 클래스 이름을 반환합니다.
- 공개 클래스 getSuperclass(): 슈퍼 클래스 참조를 반환합니다.
- 공개 클래스[] getInterfaces() : 지정된 클래스에 의해 구현된 인터페이스의 배열을 반환합니다.
-
getModifiers()의 공개: "에 매개변수로 전달되어야 하는 지정된 클래스의 수정자를 나타내는 정수 값을 반환합니다.공개 정적 문자열 toString (int i )” 주어진 클래스에 대한 액세스 지정자를 반환하는 메서드입니다.
수업에 대한 완전한 정보를 얻는 방법
public class Guru99ClassObjectCreation {
public static void main (String[] args) throws ClassNotFoundException {
//1 - By using Class.forname() method
Class c1 = Class.forName("Guru99ClassObjectCreation");
//2- By using getClass() method
Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
Class c2 = guru99Obj.getClass();
//3- By using .class
Class c3= Guru99ClassObjectCreation.class;
}
}
예시 1 : 클래스의 메타데이터를 가져오는 방법
다음 예제는 클래스 이름, 슈퍼 클래스 이름, 구현된 인터페이스, 클래스의 액세스 수정자와 같은 메타데이터를 가져오는 방법을 보여줍니다.
Guru99Base.class라는 아래 클래스의 메타데이터를 얻습니다.
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- 클래스 이름은 Guru99Base입니다.
- 액세스 수정자는 공개 및 추상입니다.
- 인터페이스를 구현했습니다: 직렬화 가능 및 복제 가능
- 어떤 클래스도 명시적으로 확장하지 않았기 때문에 슈퍼 클래스는 다음과 같습니다: java.lang.Object
아래 클래스는 Guru99Base.class의 메타 데이터를 가져와서 인쇄합니다.
import java.lang.reflect.Modifier;
public class Guru99GetclassMetaData {
public static void main (String [] args) throws ClassNotFoundException {
// Create Class object for Guru99Base.class
Class guru99ClassObj = Guru99Base.class;
// Print name of the class
system.out.println("Name of the class is : " +guru99ClassObj.getName());
// Print Super class name
system.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName());
// Get the list of implemented interfaces in the form of Class array using getInterface() method
class[] guru99InterfaceList = guru99classObj.getInterfaces();
// Print the implemented interfaces using foreach loop
system.out.print("Implemented interfaces are : ");
for (Class guru99class1 : quru99 InterfaceList) {
system.out.print guru99class1.getName() + " ");
}
system.out.println();
//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class
int guru99AccessModifier= guru99classObj.getModifiers();
// Print the access modifiers
System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));
}
}
- getName 메소드를 사용하여 클래스 이름을 인쇄합니다.
- getSuperClass().getName() 메소드를 사용하여 슈퍼 클래스의 이름을 인쇄합니다.
- 구현된 인터페이스의 이름을 인쇄합니다.
- 클래스에서 사용하는 액세스 한정자를 인쇄합니다.
예시 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";
}
-
위 클래스의 클래스 객체, 즉 Guru99VariableMetaData.class를 아래와 같이 생성합니다.
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
다음을 사용하여 필드 배열 형식으로 메타데이터를 가져옵니다. getFields() or getDeclaredFields() 아래와 같은 방법:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() 메소드는 지정된 클래스와 해당 슈퍼 클래스에서 공용 변수의 메타데이터를 반환합니다.
getDeclaredFields() 메소드는 지정된 클래스의 모든 변수에 대한 메타데이터만 반환합니다.
- “public String getName()” 메소드를 사용하여 변수 이름을 가져옵니다.
- "public Class getType()" 메소드를 사용하여 변수의 데이터 유형을 가져옵니다.
-
“public xxx get(Field)” 메소드를 사용하여 변수의 값을 가져옵니다.
여기서 xxx는 가져오려는 모든 유형의 값이 바이트이거나 짧을 수 있습니다.
-
getModifier() 및 Modifier.toString(int i) 메소드를 사용하여 변수의 액세스 한정자를 가져옵니다.
여기서는 Guru99VariableMetaData 클래스에 있는 변수의 메타데이터를 가져오는 클래스를 작성합니다.
package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class 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.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : "+field.get(guru99ClassVar)); System.out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } - Guru99VariableMetaData.class에 대한 클래스 객체가 생성되었습니다.
- 필드 배열에 있는 변수의 모든 메타데이터를 얻었습니다.
- Guru99VariableMetaData.class 클래스의 모든 변수 이름을 인쇄했습니다.
- Guru99VariableMetaData.class 클래스에 있는 변수의 모든 데이터 유형을 인쇄했습니다.
- Guru99VariableMetaData.class 클래스에 있는 변수의 모든 액세스 한정자를 인쇄했습니다.
- Guru99VariableMetaData.class 클래스에 있는 변수의 모든 데이터 유형을 인쇄했습니다.
-
위 클래스의 클래스 객체, 즉 Guru99MethodMetaData.class를 아래와 같이 생성합니다.
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
아래와 같이 getMethods() 및 getDeclaredMethods() 메서드를 사용하여 Method 배열의 메서드 정보를 가져옵니다.
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
get메소드() 메소드는 지정된 클래스와 해당 슈퍼 클래스의 공용 메소드에 대한 메타데이터를 반환합니다.
getDeclaredMethods() 메소드는 지정된 클래스의 모든 메소드에 대한 메타데이터만 반환합니다.
- 다음을 사용하여 메서드 이름을 가져옵니다. getName () 방법.
- 다음을 사용하여 메서드의 반환 유형을 가져옵니다. getReturnType() 방법.
- 다음을 사용하여 메소드의 액세스 한정자를 가져옵니다. getModifier() 및 Modifiers.toString(int i) 방법.
- 다음을 사용하여 메소드 매개변수 유형을 가져옵니다. getParameterTypes() 클래스 배열을 반환하는 메서드입니다.
-
다음을 사용하여 예외가 발생합니다. getExceptionTypes() 클래스 배열을 반환하는 메서드입니다.
- Guru99MethodMetaData.class에 대한 클래스 객체가 생성되었습니다.
- Method 배열에 있는 모든 메소드의 모든 메타데이터를 얻었습니다.
- Guru99MethodMetaData.class 클래스에 있는 모든 메소드 이름을 인쇄했습니다.
- Guru99MethodMetaData.class 클래스에 있는 메소드의 출력된 반환 유형
- Guru99MethodMetaData.class 클래스에 있는 메소드의 모든 액세스 한정자를 인쇄했습니다.
- Guru99MethodMetaData.class에 있는 메소드의 인쇄된 매개변수 유형
-
Guru99MethodMetaData.class의 메소드에 의해 인쇄된 예외가 발생합니다.
- Guru99Constructor.class에 대한 클래스 객체 생성
- 생성자 배열에 있는 모든 생성자의 모든 메타데이터를 얻었습니다.
- Guru99Constructor.class 클래스에 있는 모든 생성자의 이름을 인쇄했습니다.
- Guru99Constructor.class 클래스에 있는 생성자의 모든 액세스 한정자를 인쇄했습니다.
- Guru99Constructor.class에 있는 생성자의 인쇄된 매개변수 유형
- Guru99Constructor.class의 생성자에 의해 인쇄된 예외가 발생합니다.
- Java의 리플렉션 프로그래밍은 변수, 메소드, 생성자와 같은 클래스 및 클래스 멤버에 대한 정보를 검색하고 수정하는 데 도움이 됩니다.
- 리플렉션 API Java java.lang.reflect 패키지의 클래스와 java.lang.Class 클래스의 메서드를 사용하여 구현할 수 있습니다.
- java.lang.Class 클래스의 일반적으로 사용되는 메소드로는 getName(), getSuperclass(), getInterfaces(), getModifiers() 등이 있습니다.
- java.lang.reflect 패키지에서 일반적으로 사용되는 클래스로는 Field, Method, Constructor, Modifier 등이 있습니다.
- Reflection API는 보안 위협이 될 수 있는 클래스의 개인 메서드 및 변수에 액세스할 수 있습니다.
- Reflection API는 다음에서 제공하는 강력한 기능입니다. Java, 하지만 느린 성능, 보안 취약성, 권한 문제와 같은 일부 오버헤드가 있습니다. 따라서 리플렉션 API는 작업을 수행하는 마지막 수단으로 취급해야 합니다.
예시 3 : 메소드의 메타데이터를 얻는 방법
다음 예제는 메서드의 메타데이터를 가져오는 방법을 보여줍니다.
여기서는 몇 가지 메소드를 사용하여 Guru99MethodMetaData .class라는 클래스를 생성합니다.
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");
}
}
위 클래스의 메소드에 대한 메타데이터를 가져오는 단계는 다음과 같습니다.
여기서는 Guru99MethodMetaData.class 클래스에 있는 메서드의 메타데이터를 가져오는 클래스를 작성하고 있습니다.
package guru;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Guru99MethodMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Method MetaData.class
class guru99ClassObj = Guru99MethodMetaData.class;
// Get the metadata or information of all the methods of the class using getDeclaredMethods()
Method[] guru99Methods=guru99classObj.getDeclaredMethods();
for(Method method : guru99Methods) {
// Print the method names
System.out.println("Name of the method : "+method.getName());
// Print return type of the methods
System.out.println("Return type of the method : "+method.getReturnType());
//Get the access modifier list and print
int guru99ModifierList = method.getModifiers();
System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
// Get and print parameters of the methods
Class[] guru99ParamList= method.getParameterTypes();
system.out.print ("Method parameter types : ");
for (Class class1 : guru99ParamList){
System.out.println(class1.getName()+" ");
}
System.out.println();
// Get and print exception thrown by the method
Class[] guru99ExceptionList = method. getExceptionTypes();
system.out.print("Excpetion thrown by method :");
for (Class class1 : guru99ExceptionList) {
System.out.println (class1.getName() +" "):
}
System.Out.println();
system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
예시 4 : 생성자의 메타데이터를 가져오는 방법
다음 예제는 생성자의 메타데이터를 가져오는 방법을 보여줍니다.
여기서는 다양한 생성자를 사용하여 Guru99Constructor.class라는 클래스를 만듭니다.
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 클래스에 있는 생성자의 메타데이터를 가져오는 클래스를 작성합니다.
package guru;
import java.lang.reflect.Constructor;
public class Guru99ConstructorMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Constructor.class
Class guru99Class=Guru99Constructor.class;
// Get all the constructor information in the Constructor array
Constructor[] guru99ConstructorList = guru99Class.getConstructors();
for (Constructor constructor : guru99ConstructorList) {
// Print all name of each constructor
System.out.println("Constrcutor name : "+constructor.getName());
//Get and print access modifiers of each constructor
int guru99Modifiers= constructor.getModifiers();
System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
// Get and print parameter types
Class[] guru99ParamList=constructor.getParameterTypes();
System.out.print ("Constrctor parameter types :");
for (Class class1 : guru99ParamList) {
System.out.println(class1.getName() +" ");
}
System. out.println();
// Get and print exception thrown by constructors
Class[] guru99ExceptionList=constructor.getFxceptionTypes();
System.out.println("Exception thrown by constructors :");
for (Class class1 : guru99ExceptionList) {
System.out.println(class1.getName() +" ");
}
System.out.println();
System.out.println("*******************************************");
}
}
}
















