>  기사  >  Java  >  자바는 어떤 리플렉션인가요?

자바는 어떤 리플렉션인가요?

青灯夜游
青灯夜游원래의
2019-11-18 14:14:022530검색

자바는 어떤 리플렉션인가요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.