Java 리플렉션 분석 소개
이 문서에서는 Java Reflection의 분석 및 소개를 설명합니다
1. Reflection이란?
Baidu Encyclopedia에서 우리는 모든 클래스에 대해 이 클래스의 모든 속성과 메서드를 알 수 있으며 해당 메서드와 속성을 호출할 수 있습니다. 속성을 변경할 수 있습니다. 그리고 이것이 Java가 동적(또는 준동적)으로 간주되는 이유입니다. 동적 언어의 일반적인 정의는 프로그램이 실행될 때 프로그램 구조나 변수 유형이 다음을 수행하도록 허용하기 때문입니다. 이 언어를 동적 언어라고 합니다. 이러한 관점에서 Perl, Python, Ruby는 동적 언어이고 C++, Java, C#은 동적 언어가 아닙니다.) 언어의 핵심 속성입니다.
2. 성찰은 무엇을 할 수 있나요?
우리는 리플렉션 메커니즘을 통해 프로그램이 런타임 시 수정자(수정자), 필드(속성), 메서드(메서드) 등을 포함하여 알려진 이름을 가진 모든 클래스의 내부 정보를 얻을 수 있다는 것을 알고 있습니다. 런타임 시 필드 내용 또는 호출 메서드가 변경됩니다. 그러면 코드를 보다 유연하게 작성할 수 있으며, 구성 요소 간 소스 코드 연결 없이 코드를 런타임에 조합할 수 있으며, 동적 프록시 구현 등도 줄일 수 있습니다. 반사를 부적절하게 사용하면 비용이 매우 많이 듭니다!
3. Reflection의 구체적인 구현
다음은 기본 클래스 Person
package com.ys.reflex; public class Person { //私有属性 private String name = "Tom"; //公有属性 public int age = 18; //构造方法 public Person() { } //私有方法 private void say(){ System.out.println("private say()..."); } //公有方法 public void work(){ System.out.println("public work()..."); } }
Get the Class 3이다. 이 방법은
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object // 类型的对象,而我不知道你具体是什么类,用这种方法 Person p1 = new Person(); Class c1 = p1.getClass(); //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 // 这说明任何一个类都有一个隐含的静态成员变量 class Class c2 = Person.class; //3、通过 Class 对象的 forName() 静态方法来获取,用的最多, // 但可能抛出 ClassNotFoundException 异常 Class c3 = Class.forName("com.ys.reflex.Person");
다음 사항에 유의해야 합니다. 클래스는 JVM에서 하나의 Class 인스턴스만 갖습니다. 즉, 위에서 얻은 c1을 수행합니다. , c2, c3 같음을 비교하여 모두 참인지 확인
②, 멤버 변수, 멤버 메소드, 인터페이스, 슈퍼 클래스, 생성자 등을 다음을 통해 가져옵니다. Class 클래스
API를 보면 Class에 많은 메소드가 있음을 알 수 있습니다.
getName(): 클래스의 전체 이름을 가져옵니다.
getFields(): 클래스의 공개 유형 속성을 가져옵니다.
getDeclaredFields(): 클래스의 모든 속성을 가져옵니다. 비공개 선언 및 상속 클래스 포함
getMethods(): 클래스의 공개 유형 메서드를 가져옵니다.
getDeclaredMethods(): 클래스의 모든 메소드를 가져옵니다. 비공개로 선언되고 상속된 클래스 포함
getMethod(String name, Class[] 매개변수 유형): 클래스의 특정 메서드를 가져오고, name 매개 변수는 메서드 이름을 지정하고, 매개 변수 Types 매개 변수는 메서드의 매개 변수 유형을 지정합니다.
GetConstructors(): 클래스의 공개 유형 생성자를 가져옵니다.
getConstructor(Class[] 매개변수 유형): 클래스의 특정 생성자 메서드를 가져옵니다. 매개변수 유형은 생성자 메서드의 매개변수 유형을 지정합니다.
newInstance(): 매개변수 없이 클래스 생성자를 통해 이 클래스의 객체를 생성합니다.
위 방법을 종합적으로 설명하기 위해 예제를 사용합니다.
//获得类完整的名字 String className = c2.getName(); System.out.println(className);//输出com.ys.reflex.Person //获得类的public类型的属性。 Field[] fields = c2.getFields(); for(Field field : fields){ System.out.println(field.getName());//age } //获得类的所有属性。包括私有的和继承类的 Field [] allFields = c2.getDeclaredFields(); for(Field field : allFields){ System.out.println(field.getName());//name age } //获得类的public类型的方法。这里包括 Object 类的一些方法 Method [] methods = c2.getMethods(); for(Method method : methods){ System.out.println(method.getName());//work waid equls toString hashCode等 } //获得类的所有方法。 Method [] allMethods = c2.getDeclaredMethods(); for(Method method : allMethods){ System.out.println(method.getName());//work say } //获得指定的属性 Field f1 = c2.getField("age"); System.out.println(f1); //获得指定的私有属性 Field f2 = c2.getDeclaredField("name"); //启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消 f2.setAccessible(true); System.out.println(f2); //创建这个类的一个对象 Object p2 = c2.newInstance(); //将 p2 对象的 f2 属性赋值为 Bob,f2 属性即为 私有属性 name f2.set(p2,"Bob"); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 System.out.println(f2.get(p2)); //Bob //获取构造方法 Constructor [] constructors = c2.getConstructors(); for(Constructor constructor : constructors){ System.out.println(constructor.toString());//public com.ys.reflex.Person() }
4. 리플렉션 요약
리플렉션을 유연하게 사용하면 코드가 더욱 유연해집니다. 여기에 예제가 있습니다. JDBC 네이티브 코드 등록 드라이버, 최대 절전 모드의 엔터티 클래스, Spring의 AOP 등은 모두 리플렉션 구현을 가지고 있습니다. 그러나 모든 것에는 양면이 있습니다. 또한 합리적인 사용은 시스템의 성능과 복잡성을 증가시킵니다.
위 내용은 Java 리플렉션 분석 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 리플렉션은 클래스의 비공개 필드와 메서드에 액세스할 수 있게 하여 소프트웨어의 내부 작동을 드러낼 수 있는 강력한 도구입니다. 이는 리버스 엔지니어링, 소프트웨어 분석 및 디버깅과 같은 영역에서 유용합니다. Java 리플렉션을 사용하려면 먼저 java.lang.reflect 패키지를 가져와야 합니다. 그런 다음 Class.forName() 메서드를 사용하여 클래스의 Class 객체를 얻을 수 있습니다. Class 객체가 있으면 다양한 메서드를 사용하여 클래스의 필드와 메서드에 액세스할 수 있습니다. 예를 들어, getDeclaredFields() 메서드를 사용하여 비공개 필드를 포함하여 클래스의 모든 필드를 가져올 수 있습니다. getDeclaredMethods() 메소드를 사용할 수도 있습니다.

획득 방법: 1. 샘플 객체를 생성합니다. 2. field.get(person)을 통해 필드 값을 얻습니다. 여기서 person은 샘플 객체이고 field는 필드를 나타내는 Field 객체입니다. 3. setAccessible(true)을 통해 필드를 설정합니다. ) 액세스 가능한 상태에서는 비공개 필드도 해당 값을 얻을 수 있습니다. 4. 필드 배열을 탐색하고 각 필드의 이름과 해당 값을 가져온 후 인쇄합니다.

Java 반사 메커니즘의 원리는 바이트코드 파일이 메모리에 로드될 때 jvm이 바이트코드를 분석하고 객체의 클래스 객체를 생성한다는 것입니다. Class 객체를 사용하면 객체의 속성이나 메서드 등을 설정할 수 있습니다. 리플렉션 메커니즘은 실행 상태에 있는 모든 클래스의 모든 속성과 메서드를 아는 기능입니다. 모든 개체에 대해 해당 속성과 메서드를 호출하고 동적으로 정보를 얻고 개체 메서드를 동적으로 호출할 수 있습니다.

Java 반사 메커니즘을 통해 객체를 생성하는 단계는 다음과 같습니다. 대상 클래스를 로드합니다. Class.forName() 메서드를 사용합니다. 생성자를 가져옵니다. getDeclaredConstructor() 메서드를 사용합니다. 객체 생성: newInstance() 메서드를 사용하여 매개변수를 전달합니다.

Java 리플렉션 메커니즘의 원리와 응용에 대한 심층적인 이해 1. 리플렉션 메커니즘의 개념과 원리 리플렉션 메커니즘은 클래스 정보를 동적으로 얻고, 클래스 멤버(속성, 메소드, 생성자 등)에 액세스하고 조작하는 기능을 말합니다. 프로그램이 실행 중입니다. 리플렉션 메커니즘을 통해 컴파일 타임에 클래스의 특정 정보를 알지 못해도 프로그램이 실행되는 동안 동적으로 개체를 생성하고, 메서드를 호출하고, 속성에 액세스할 수 있습니다. 리플렉션 메커니즘의 핵심은 java.lang.reflect 패키지의 클래스와 인터페이스입니다. 그 중 Class 클래스는 클래스의 바이트를 나타낸다.

획득 방법: 1. Person 클래스를 생성하고 리플렉션을 통해 클래스의 Class 객체를 획득합니다. 2. getDeclaredFields 메서드를 사용하여 클래스의 모든 필드를 획득합니다. 3. 필드 배열을 탐색하여 필드를 액세스 가능한 상태로 설정합니다. 그런 다음 get을 사용하십시오. 이 메소드는 필드 값을 가져오고 필드 이름과 값을 인쇄합니다.

Java의 NoSuchFieldException 예외는 리플렉션 중에 존재하지 않는 필드(Field)에 액세스하려고 할 때 발생하는 예외를 나타냅니다. Java에서 리플렉션을 사용하면 코드를 통해 프로그램의 클래스, 메서드, 변수 등을 조작할 수 있으므로 프로그램이 더욱 유연하고 확장 가능해집니다. 그러나 리플렉션을 사용할 때 액세스된 필드가 존재하지 않으면 NoSuchFieldException이 발생합니다. NoSuchFieldException

Java 리플렉션 호출 메서드는 다음과 같습니다. 1. 클래스 클래스 2. 생성자 클래스 4. 필드 클래스. 자세한 소개: 1. 클래스 이름, 멤버 변수 및 메소드 등을 포함한 클래스 정보를 얻는 데 사용되는 클래스 클래스. 클래스 클래스의 "newInstance()" 메소드를 통해 클래스의 인스턴스를 생성할 수 있습니다. 2. 생성자 클래스, 생성자 매개변수 유형, 수정자, 반환 유형 및 기타 정보 등을 얻는 데 사용됩니다.
