Reflection은 실행 중인 Java 프로그램이 자체 정보를 얻고 런타임 시 Java 개체의 속성, 메서드, 생성자 등에 액세스할 수 있도록 하는 Java 프로그램 개발 언어의 기능 중 하나입니다.
애플리케이션 시나리오
범용 프레임워크 개발 - 리플렉션의 가장 중요한 용도는 다양한 범용 프레임워크를 개발하는 것입니다. 예를 들어 Spring은 XML 파일을 통해 JavaBeans, 필터 등을 구성합니다. 프레임워크의 다양성을 보장하기 위해 구성 파일에 따라 다른 개체나 클래스를 로드하고 다른 메서드를 호출해야 할 수 있습니다. 사용 - 런타임 시 동적 로딩이 필요합니다. 동적 프록시 - AOP(Aspect 프로그래밍)에서는 특정 메서드를 가로채는 것이 필요합니다. 일반적으로 동적 프록시 메서드가 선택됩니다. 주석 - 주석 자체는 주석 역할만 수행하며 주석 표시에 따라 주석 해석기를 호출하고 동작을 실행하려면 반사 메커니즘을 사용해야 합니다. 반영이 없으면 주석은 주석보다 더 유용하지 않습니다. 확장성 기능 - 애플리케이션은 정규화된 이름을 사용하여 확장성 개체 인스턴스를 생성하여 외부 사용자 정의 클래스를 사용할 수 있습니다. 단점
높은 성능 오버헤드 - 반사 작업의 성능은 비반사 작업보다 나쁘므로 성능에 민감한 애플리케이션에서 자주 호출되는 코드 세그먼트에서는 피해야 합니다. 캡슐화 중단 - 리플렉션을 통해 메서드를 호출할 때 권한 검사가 무시될 수 있으므로 잠재적으로 캡슐화가 중단되고 보안 문제가 발생할 수 있습니다. 내부 노출 - 리플렉션을 사용하면 코드가 프라이빗 필드 및 메서드에 액세스하는 등 리플렉션되지 않은 코드에서 불법적인 작업을 수행할 수 있으므로 리플렉션을 사용하면 의도하지 않은 부작용이 발생하여 코드가 오작동하고 잠재적으로 이식성이 손상될 수 있습니다. 반사 코드는 추상화를 깨뜨리므로 플랫폼이 업그레이드됨에 따라 동작이 변경될 수 있습니다. 클래스 객체
리플렉션을 사용하려면 먼저 작업할 클래스에 해당하는 클래스 객체를 얻어야 합니다.
반영의 본질: 런타임 시 각 Java 클래스의 다양한 속성이 개별 Java 개체에 매핑됩니다.
다음 코드가 정의된 경우:
User user = new User();
1 JVM이 메소드를 로드하고 new User()를 발견하면 JVM은 정규화된 이름을 기반으로 User.class를 로드합니다. the User;
2. JVM은 로컬 디스크에서 User.class 파일을 찾아 JVM 메모리에 로드합니다.
3. JVM은 클래스 로더를 호출하여 이 클래스에 해당하는 Class 객체를 자동으로 생성하고 이를 JVM의 메소드 영역에 저장합니다.
클래스를 얻는 세 가지 방법:
(1) 클래스 클래스의 forName 정적 메서드 사용
응용 시나리오
범용 프레임워크 개발 - 리플렉션의 가장 중요한 용도는 다양한 범용 프레임워크를 개발하는 것입니다. 예를 들어 Spring은 XML 파일을 통해 JavaBeans, 필터 등을 구성합니다. 프레임워크의 다양성을 보장하기 위해 구성 파일에 따라 다른 개체나 클래스를 로드하고 다른 메서드를 호출해야 할 수 있습니다. 사용 - 런타임 시 동적 로딩이 필요합니다. 동적 프록시 - AOP(Aspect 프로그래밍)에서는 특정 메서드를 가로채는 것이 필요합니다. 일반적으로 동적 프록시 메서드가 선택됩니다. 주석 - 주석 자체는 주석 표시에 따라 주석 해석기를 호출하고 동작을 실행하기 위해 반사 메커니즘을 사용해야 합니다. 반영이 없으면 주석은 주석보다 더 유용하지 않습니다. 확장성 기능 - 애플리케이션은 정규화된 이름을 사용하여 확장성 개체 인스턴스를 생성하여 외부 사용자 정의 클래스를 사용할 수 있습니다. 단점
높은 성능 오버헤드 - 반사 작업의 성능은 비반사 작업보다 나쁘므로 성능에 민감한 애플리케이션에서 자주 호출되는 코드 세그먼트에서는 피해야 합니다. 캡슐화 중단 - 리플렉션을 통해 메서드를 호출할 때 권한 검사가 무시될 수 있으므로 잠재적으로 캡슐화가 중단되고 보안 문제가 발생할 수 있습니다. 내부 노출 - 리플렉션을 사용하면 코드가 프라이빗 필드 및 메서드에 액세스하는 등 리플렉션되지 않은 코드에서 불법적인 작업을 수행할 수 있으므로 리플렉션을 사용하면 의도하지 않은 부작용이 발생하여 코드가 오작동하고 잠재적으로 이식성이 손상될 수 있습니다. 반사 코드는 추상화를 깨뜨리므로 플랫폼이 업그레이드됨에 따라 동작이 변경될 수 있습니다. 클래스 객체
리플렉션을 사용하려면 먼저 작업할 클래스에 해당하는 클래스 객체를 얻어야 합니다.
반영의 본질: 런타임 시 각 Java 클래스의 다양한 속성이 개별 Java 개체에 매핑됩니다.
다음 코드가 정의된 경우:
User user = new User();
1 JVM이 메소드를 로드하고 new User()를 발견하면 JVM은 정규화된 이름을 기반으로 User.class를 로드합니다. the User;
2. JVM은 로컬 디스크에서 User.class 파일을 찾아 JVM 메모리에 로드합니다.
3. JVM은 클래스 로더를 호출하여 이 클래스에 해당하는 클래스 객체를 자동으로 생성하고 이를 JVM의 메소드 영역에 저장합니다.
Class를 얻는 세 가지 방법:
(1) Class 클래스의 forName 정적 메서드를 사용하세요
(2) Object의 getClass 메소드를 호출하여
Reflection을 호출하여 인스턴스 객체를 생성합니다.
Class 객체의 newInstance 메소드를 사용합니다. 생성자 개체의 newInstance 메소드 사용
java.lang.reflect 패키지
Member 인터페이스의 핵심 인터페이스 및 클래스 - 단일 멤버(필드 또는 메소드) 또는 생성자에 대한 식별 정보를 반영합니다. 필드 클래스 - 클래스 필드에 대한 정보와 클래스 필드에 액세스하기 위한 인터페이스를 제공합니다. 메소드 클래스 - 클래스의 메소드에 대한 정보와 클래스의 메소드에 액세스하기 위한 인터페이스를 제공합니다. 생성자 클래스 - 클래스 생성자에 대한 정보와 클래스 생성자에 액세스하기 위한 인터페이스를 제공합니다. 배열 클래스 - 이 클래스는 JAVA 배열을 동적으로 생성하고 액세스하는 메소드를 제공합니다. 수정자 클래스 - 클래스 및 멤버 액세스 수정자를 디코딩하기 위한 정적 메서드와 상수를 제공합니다. 프록시 클래스 - 프록시 클래스 및 클래스 인스턴스를 동적으로 생성하는 정적 메서드를 제공합니다.
【추천 강좌: Java 관련 강좌】
위 내용은 Java 기본 리플렉션에 대한 간략한 소개 Reflection의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!