자바 리플렉션이란 무엇입니까? Java 반사 메커니즘에 대한 자세한 소개
이 기사에서는 Java 리플렉션이 무엇인지 설명합니다. Java 반사 메커니즘에 대한 자세한 소개는 특정 참조 가치가 있습니다. 도움이 필요한 친구가 참조할 수 있기를 바랍니다.
1. 개념
자바 리플렉션(Reflection)은 자바 프로그램이 실행될 때까지 이름을 알 수 없는 클래스를 로드하고, 클래스의 완전한 구성 방법을 얻고, 객체를 인스턴스화하고, 해당 클래스에 대한 값을 설정할 수 있음을 의미합니다. 개체 속성을 사용하거나 개체 메서드를 호출하세요. 런타임에 동적으로 클래스 정보를 얻고 객체 메소드를 동적으로 호출하는 기능을 Java의 반사 메커니즘이라고 합니다.
2. 클래스 클래스
클래스 클래스는 Object 클래스에서 상속되며 클래스 또는 인터페이스의 런타임 정보를 캡슐화합니다. 이 정보는 클래스 클래스의 메서드를 호출하여 얻을 수 있습니다. . 이 클래스 클래스를 이해하는 방법은 무엇입니까? 일반 클래스가 모든 객체 메서드와 속성의 컬렉션이라면 이 클래스 클래스는 모든 일반 클래스의 컬렉션으로 이해될 수 있습니다.
다음은 클래스 클래스를 얻는 여러 가지 방법입니다.
public class TestClass { public static void main(String[] args) throws ClassNotFoundException { // 1、 Class.forName(); Class<?> aClass0 = Class.forName("java.lang.Object"); // 2、类名.Class Class<Integer> aClass1 = Integer.class; // 3、包装类.TYPE —— 返回基本类型的 Class 引用,基本类型在虚拟机运行时就已经加载了它的Class Class<Integer> aClass2 = Integer.TYPE; // 4、对象名.getClass() String str = "Hello, World"; Class<? extends String> aClass3 = str.getClass(); // 5、Class类.getSuperClass() —— 获得父类的 Class 对象 Class<?> aClass4 = aClass3.getSuperclass(); System.out.println(aClass0.getName()); System.out.println(aClass1.getName()); System.out.println(aClass2.getName()); System.out.println(aClass3.getName()); System.out.println(aClass4.getName()); } }
3. 클래스 정보 얻기
Java의 반사 메커니즘을 테스트하기 위해 네 가지 캡슐화 속성을 포함하는 한 쌍의 새로운 상위-하위 클래스를 만들었습니다. 여러 유형의 정보 획득 테스트:
Vehicle.java
vpublic class Vehicle { private String color; protected Integer seat; int year; public Date createdOn; private String getColor() { return color; } protected Integer getSeat() { return seat; } int getYear() { return year; } public Date getCreatedOn() { return createdOn; } }
Car.java
public class Car extends Vehicle { private String brand; protected Integer a; int b; public Date updatedOn; public Car(){} private Car(String brand, Integer a, int b, Date updatedOn) { this.brand = brand; this.a = a; this.b = b; this.updatedOn = updatedOn; } private String getBrand() { return brand; } protected Integer getA() { return a; } int getB() { return b; } public Date getUpdatedOn() { return updatedOn; } }
1. 메소드 획득
클래스 클래스는 주로 다음 두 가지 방법으로 메소드를 획득합니다.
Method[] getMethods( ) 클래스 또는 인터페이스의 액세스 가능한 모든 공용 메서드(상속된 공용 메서드 포함)를 반환합니다.
Method[] getDeclaredMethods()는 이 클래스 또는 인터페이스의 모든 메서드를 반환합니다(상속된 메서드 제외).
public class TestMethod { public static void main(String[] args) { Class<Car> carClass = Car.class; Method[] methods = carClass.getMethods(); Method[] declaredMethods = carClass.getDeclaredMethods(); for (Method method : methods) { //for (Method method : declaredMethods) { System.out.println("方法名:" + method.getName()); System.out.println("该方法所在的类或接口:" + method.getDeclaringClass()); System.out.println("该方法的参数列表:" + method.getParameterTypes()); System.out.println("该方法的异常列表:" + method.getExceptionTypes()); System.out.println("该方法的返回值类型:" + method.getReturnType()); } } }
2. 속성 가져오기
클래스 클래스는 주로 다음 두 가지 방법으로 속성을 얻습니다.
Field[] getFields(): 클래스 또는 인터페이스의 액세스 가능한 모든 공개 속성(상속된 공개 속성 포함)을 저장합니다.
Field[] getDeclaredFields(): 클래스 또는 인터페이스의 모든 속성을 저장합니다(상속된 속성 제외).
public class TestField { public static void main(String[] args) { Class<Car> carClass = Car.class; Field[] fields = carClass.getFields(); Field[] declaredFields = carClass.getDeclaredFields(); //for (Field field : fields) { for (Field field : declaredFields) { System.out.println("属性名称是:" + field.getName()); System.out.println("该属性所在的类或接口是:" + field.getDeclaringClass()); System.out.println("该属性的类型是:" + field.getType()); // field.getModifiers() 以整数形式返回由此 Field 对象表示的属性的 Java 访问权限修饰符 System.out.println("该属性的修饰符是:" + Modifier.toString(field.getModifiers())); } } }
3. 생성자 가져오기
Class 클래스는 주로 다음 두 가지 방법으로 생성자 메서드를 가져옵니다.
Constructor>[] getConstructors(): 클래스 또는 인터페이스의 모든 공용 생성자를 반환합니다.
Constructor< ;?>[] getDeclaredConstructors(): 클래스 또는 인터페이스의 모든 구성 메소드를 반환합니다
public class TestConstructor { public static void main(String[] args) throws NoSuchMethodException { Class<Car> carClass = Car.class; Constructor<?>[] constructors = carClass.getConstructors(); Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors(); Constructor<Car> carConstructor = carClass.getDeclaredConstructor(String.class, Integer.class, Integer.TYPE, Date.class); //for (Constructor constructor : declaredConstructors) { for (Constructor constructor : constructors) { System.out.println("该构造器的名称是:" + constructor.getName()); System.out.println("该构造器所在的类或接口是:" + constructor.getDeclaringClass()); //返回构造方法的参数类型 constructor.getParameterTypes(); } } }
4. 동적 호출
지금까지 Class 클래스의 메소드를 통해 해당 클래스 속성, 메소드 및 메소드를 얻었습니다. 생성자 세부정보. 다음으로 이 정보를 사용하여 객체를 동적으로 생성하고 속성을 수정하며 메서드를 동적으로 호출합니다.
아아아아위 내용은 자바 리플렉션이란 무엇입니까? 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 클래스는 클래스의 바이트를 나타낸다.

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

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

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