java어떤 반성?
Reflection은 Java의 기능 중 하나이며 대상 객체를 간접적으로 조작하는 메커니즘입니다.
JAVA 리플렉션 메커니즘은 모든 엔터티 클래스에 대해 이 클래스의 모든 속성과 메서드를 알 수 있으며 해당 메서드와 속성을 호출할 수 있습니다. 동적으로 정보를 얻고 객체 메소드를 동적으로 호출하는 기능을 Java 언어의 반영 메커니즘이라고 합니다.
Java에서 리플렉션이 필요한 이유는 무엇인가요? 반성은 어떤 문제를 해결합니까?
한 문장에서 리플렉션은 jvm에 동적으로 컴파일하는 기능을 제공할 수 있습니다. 그렇지 않으면 클래스의 메타데이터 정보는 정적 컴파일을 통해서만 얻을 수 있습니다. , 핫 로딩, Tomcat의 클래스 로더 등은 지원할 수 없습니다.
Java에는 두 가지 컴파일 유형이 있습니다.
● 정적 컴파일: 유형은 다음에서 결정됩니다. 컴파일 시간. 바인딩된 개체가 전달됩니다.
● 동적 컴파일: 유형을 결정하고 런타임에 객체를 바인딩합니다. 동적 컴파일은 Java의 유연성을 극대화하고 다형성 애플리케이션을 구현하며 클래스 간의 결합을 줄일 수 있습니다.
Java 리플렉션은 동적(또는 준동적) 언어로 간주되는 Java의 핵심 속성입니다. 이 메커니즘을 사용하면 프로그램은 수정자(예: public, static 등), 슈퍼클래스(예: Object), 구현된 인터페이스(예: 복제 가능) 및 필드 및 메소드에 대한 모든 정보를 제공하며 런타임 시 필드 내용을 변경하거나 메소드를 호출할 수 있습니다.
Reflection은 런타임에 컴파일하는 동안 전혀 알려지지 않은 클래스를 로드, 감지 및 사용할 수 있습니다. 즉, Java 프로그램은 런타임에만 이름이 알려진 클래스를 로드하고, 완전한 구조를 얻고, 객체 엔터티를 생성하거나, 해당 필드에 대한 값을 설정하거나, 메소드를 호출할 수 있습니다.
Reflection을 사용하면 정적 언어가 런타임 시 프로그램의 구조와 동작을 검사하고 수정할 수 있습니다.
정적 언어에서는 변수를 사용할 때 해당 유형을 알아야 합니다. Java에서는 변수의 유형 정보가 컴파일 중에 클래스 파일에 저장되므로 런타임 시 정확성을 얻을 수 있습니다. 즉, 런타임 시 프로그램의 동작이 고정됩니다. 런타임에 변경하려면 리플렉션이 필요합니다.
Java 리플렉션 메커니즘을 구현하는 클래스는 모두 java.lang.reflect 패키지에 있습니다:
1 클래스 클래스: 클래스
#🎜를 나타냅니다. 🎜#2. 필드 클래스: 클래스의 멤버 변수를 나타냅니다(클래스 속성)3. 메소드 클래스: 생성자 클래스의 메소드를 나타냅니다4. 클래스#🎜 🎜#
5의 생성 방법을 나타냅니다. 배열 클래스: 배열을 동적으로 생성하고 배열 요소에 액세스하기 위한 정적 메서드를 제공합니다 사용
1. 획득 방법 세 가지. 클래스 객체
1.1 객체 ——> getClass();1.2 모든 데이터 유형(기본 데이터 유형 포함)에는 "정적" 클래스 속성이 있습니다1.3 클래스 클래스 메소드의 정적 특성을 통해: forName(String className)(일반적으로 사용됨)
/** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 * 3 通过Class类的静态方法:forName(String className)(常用) * */ public class Fanshe { public static void main(String[] args) { //第一种方式获取Class对象 Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。 Class stuClass = stu1.getClass();//获取Class对象 System.out.println(stuClass.getName()); //第二种方式获取Class对象 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2); //判断第一种方式获取的Class对象和第二种方式获取的是否是同一个 //第三种方式获取Class对象 try { Class stuClass3 = Class.forName("fanshe.Student"); //注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 System.out.println(stuClass3 == stuClass2); //判断三种方式是否获取的是同一个Class对象 } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("*****************获取公有、无参的构造方法*************"); Constructor con = clazz.getConstructor(null); //1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型 //2>、返回的是描述这个无参构造函数的类对象。 System.out.println("*************获取公有字段**并调用*****************"); Field f = stuClass.getField("name"); System.out.println(f); System.out.println("***************获取私有的show4()方法******************"); m = stuClass.getDeclaredMethod("show4", int.class); System.out.println(m); m.setAccessible(true);//解除私有限定 Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参 System.out.println("返回值:" + result); } }
위 내용은 자바는 어떤 리플렉션인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!