logo

자바 리플렉션 API

자바 리플렉션런타임 시 클래스의 런타임 동작을 검사하거나 수정하는 프로세스 .

그만큼 java.lang.클래스 클래스는 메타데이터를 가져오고 클래스의 런타임 동작을 검사 및 변경하는 데 사용할 수 있는 다양한 메서드를 제공합니다.

java.lang 및 java.lang.reflect 패키지는 Java 리플렉션을 위한 클래스를 제공합니다.

플로피 디스크

사용되는 곳

Reflection API는 주로 다음에서 사용됩니다.

  • IDE(통합 개발 환경)(예: Eclipse, MyEclipse, NetBeans 등)
  • 디버거
  • 테스트 도구 등
당신은 알고 있나요?
  • Class 클래스의 인스턴스를 얻을 수 있는 방법은 몇 가지입니까?
  • javap 도구를 만드는 방법은 무엇입니까?
  • 애플릿 뷰어 도구를 만드는 방법은 무엇입니까?
  • 클래스 외부에서 개인 메소드에 액세스하는 방법은 무엇입니까?

java.lang.Class 클래스

java.lang.Class 클래스는 주로 두 가지 작업을 수행합니다.

  • 런타임에 클래스의 메타데이터를 가져오는 메서드를 제공합니다.
  • 클래스의 런타임 동작을 검사하고 변경하는 메서드를 제공합니다.

Class 클래스의 일반적으로 사용되는 메서드:

방법설명
1) 공개 문자열 getName()클래스 이름을 반환합니다.
2) public static Class forName(String className)에서 ClassNotFoundException이 발생합니다.클래스를 로드하고 Class 클래스의 참조를 반환합니다.
3) 공용 객체 newInstance()는 InstantiationException,IllegalAccessException을 발생시킵니다.새 인스턴스를 만듭니다.
4) 공개 부울 isInterface()인터페이스인지 확인합니다.
5) 공개 부울 isArray();배열인지 확인합니다.
6) 공개 부울 isPrimitive()원시인지 확인합니다.
7) 공개 클래스 getSuperclass()슈퍼클래스 클래스 참조를 반환합니다.
8) public Field[] getDeclaredFields()에서 SecurityException이 발생합니다.이 클래스의 총 필드 수를 반환합니다.
9) 공용 메소드[] getDeclaredMethods()에서 SecurityException이 발생합니다.이 클래스의 총 메소드 수를 반환합니다.
10) public Constructor[] getDeclaredConstructors()에서 SecurityException이 발생합니다.이 클래스의 총 생성자 수를 반환합니다.
11) 공용 메소드 getDeclaredMethod(문자열 이름, 클래스[] 매개변수 유형)는 NoSuchMethodException,SecurityException을 발생시킵니다.메소드 클래스 인스턴스를 반환합니다.

Class 클래스의 객체를 얻는 방법은 무엇입니까?

Class 클래스의 인스턴스를 얻는 방법에는 3가지가 있습니다. 그것들은 다음과 같습니다:

  • Class 클래스의 forName() 메서드
  • Object 클래스의 getClass() 메소드
  • .class 구문

1) Class 클래스의 forName() 메소드

  • 클래스를 동적으로 로드하는 데 사용됩니다.
  • Class 클래스의 인스턴스를 반환합니다.
  • 클래스의 정규화된 이름을 알고 있는 경우 사용해야 합니다. 기본 유형에는 사용할 수 없습니다.

forName() 메소드의 간단한 예를 살펴보겠습니다.

파일 이름: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

산출:

 Simple 

2) Object 클래스의 getClass() 메소드

Class 클래스의 인스턴스를 반환합니다. 유형을 알고 있는 경우 사용해야 합니다. 또한 기본 요소와 함께 사용할 수도 있습니다.

리눅스 파일

파일 이름: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

산출:

Simple 

3) .class 구문

유형을 사용할 수 있지만 인스턴스가 없는 경우 유형 이름에 '.class'를 추가하여 클래스를 얻을 수 있습니다. 기본 데이터 유형에도 사용할 수 있습니다.

파일 이름: Test.java

 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

산출:

 boolean Test 

클래스 객체 결정

Class 클래스의 다음 메소드는 클래스 객체를 결정하는 데 사용됩니다.

1) 공개 부울 isInterface(): 지정된 Class 객체가 인터페이스 유형을 나타내는지 확인합니다.

자바의 문자열 길이

2) 공개 부울 isArray(): 이 Class 객체가 배열 클래스를 나타내는지 여부를 결정합니다.

3) 공개 부울 isPrimitive(): 지정된 Class 객체가 기본 유형을 나타내는지 확인합니다.

객체 유형을 결정하는 리플렉션 API의 간단한 예를 살펴보겠습니다.

파일 이름: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

산출:

 false true 

반사의 장점과 단점

Java 리플렉션은 항상 주의해서 사용해야 합니다. 반사는 많은 장점을 제공하지만 몇 가지 단점도 있습니다. 장점을 먼저 이야기해보겠습니다.

장점: 컴파일 시간 동안 이름을 사용하지 않고도 리플렉션을 사용하여 런타임 동안 인터페이스, 클래스, 메서드 및 필드를 검사할 수 있습니다. 메소드를 호출하거나, 클리어를 인스턴스화하거나, 리플렉션을 사용하여 필드 값을 설정하는 것도 가능합니다. 개발자가 올바른 코드를 작성하는 데 도움을 주는 시각적 개발 환경 및 클래스 브라우저를 생성하는 데 도움이 됩니다.

피트 데이비슨

단점: 리플렉션을 사용하면 캡슐화 원칙을 깨뜨릴 수 있습니다. 리플렉션을 사용하여 클래스의 비공개 메서드와 필드에 액세스할 수 있습니다. 따라서 리플렉션을 수행하면 중요한 데이터가 외부로 유출될 수 있어 위험합니다. 예를 들어, 한 클래스의 전용 멤버에 액세스하여 null 값을 설정하면 동일한 클래스의 다른 사용자가 NullReferenceException을 얻을 수 있으며 이 동작은 예상되지 않습니다.

또 다른 단점은 성능상의 오버헤드이다. 리플렉션의 유형은 동적으로 확인되므로 JVM(Java Virtual Machine) 최적화가 발생할 수 없습니다. 따라서 반사에 의해 수행되는 작업은 일반적으로 느립니다.

결론

위에서 언급한 단점 때문에 일반적으로 리플렉션을 사용하지 않는 것이 좋습니다. 언어의 기본에 대한 지식이 풍부한 프로그래머나 개발자만이 사용해야 하는 고급 기능입니다. 항상 기억해! 리플렉션을 사용할 때마다 애플리케이션의 보안이 손상됩니다.


Reflection API 튜토리얼의 다음 주제

newInstance() 메서드
javap 도구 이해
javap 도구 생성
애플릿뷰어 도구 생성
다른 클래스에서 개인 메소드 호출