Java에서 리플렉션은 주로 프로그램이 자체 상태나 동작에 액세스하고 이를 감지하고 수정하는 능력을 의미합니다. Java 반사 메커니즘의 주요 기능은 다음과 같습니다. 1. 런타임 시 객체가 속한 클래스를 결정합니다. 2. 런타임 시 모든 클래스의 객체를 구성합니다. 3. 런타임 시 객체의 메서드를 호출합니다.
이 튜토리얼의 운영 환경: windows7 시스템, java8 버전, DELL G3 컴퓨터.
주로 프로그램의 자체 상태나 동작에 액세스, 감지 및 수정하는 능력을 말합니다.
Java 런타임 환경에서 모든 클래스에 대해 이 클래스가 어떤 속성과 메서드를 가지고 있는지 알 수 있나요? 모든 개체에 대해 해당 메서드를 호출할 수 있습니까? Java 반사 메커니즘은 주로 다음 기능을 제공합니다.
* 1. 런타임 시 개체가 속하는 클래스를 결정합니다.
* 2. 런타임에 모든 클래스의 객체를 생성합니다.
* 3. 런타임 시 모든 클래스의 멤버 변수와 메서드를 결정합니다.
* 4. 런타임에 객체의 메서드를 호출합니다.
이 메커니즘을 통해 프로그램은 런타임 시 Reflection API를 통해 알려진 이름을 가진 모든 클래스의 내부 정보를 얻을 수 있습니다.
해당 수정자(예: public, static 등), 슈퍼클래스(예: Object), 구현된 인터페이스(예: 직렬화 가능)는 물론 해당 필드와 메서드에 대한 모든 정보를 포함하고 필드 내용을 변경할 수 있습니다. 런타임에 메서드를 호출합니다.
동적 언어이러한 관점에서 Perl, Python, Ruby는 동적 언어인 반면 C++, Java, C#은 동적 언어가 아닙니다.
Java는 이 정의와 분류에 따른 동적 언어는 아니지만 매우 눈에 띄는 동적 관련 메커니즘인 Reflection을 가지고 있습니다. 이 단어는 반사, 이미지, 반사를 의미합니다. Java에서 사용되면 컴파일 중에 전혀 알려지지 않은 클래스를 런타임에 로드, 감지 및 사용할 수 있음을 의미합니다.
즉, Java 프로그램은 런타임에만 이름이 알려진 클래스를 로드하고, 전체 구조를 학습하고(메소드 정의는 포함하지 않음) 객체 엔터티를 생성하거나 해당 필드에 대한 값을 설정하거나 호출할 수 있습니다. 그 방법.
이러한 자기 자신을 성찰하는 프로그램의 능력을 인트로스펙션(introspection, introspection, introspection)이라고 합니다. 성찰과 성찰은 자주 함께 언급되는 두 가지 용어입니다.
Java Reflection API 소개클래스 클래스에 있습니다. : java.lang 패키지 아래에 위치한 클래스를 나타냅니다.
Field 클래스: 클래스의 멤버 변수를 나타냅니다(멤버 변수는 클래스의 속성이라고도 합니다).
메소드 클래스: 클래스의 메소드를 나타냅니다.
생성자 클래스: 클래스의 생성 방법을 나타냅니다.
배열 클래스: 배열을 동적으로 생성하고 배열 요소에 액세스하기 위한 정적 메서드를 제공합니다.
클래스 객체Java에서는 특정 클래스의 객체가 아무리 많이 생성되어도 이러한 객체는 동일한 Class 객체에 해당합니다.
이 클래스 객체는 JVM에서 생성되며 이를 통해 전체 클래스의 구조를 학습할 수 있습니다.
Class 객체를 얻기 위해 일반적으로 사용되는 세 가지 방법:
1 Class 클래스의 정적 메서드를 사용합니다. 예:
Class.forName(“java.lang.String”);
2. 클래스의 .class 구문을 사용합니다. 예:
String.class;
3. 객체의 getClass() 메서드를 사용하세요. 예:
String str = “aa”; Class
Routine 1: Get the method 루틴 DumpMethods 클래스는 Reflection API의 기본 기능을 보여주고 명령줄 매개변수로 지정된 클래스 이름을 읽은 다음 해당 메서드 정보를 인쇄합니다. 이 수업.
import java.lang.reflect.Method; public class DumpMethods { public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了 { //获得字符串所标识的类的class对象 Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0] //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法) Method[] methods = classType.getDeclaredMethods(); //遍历输出所有方法声明 for(Method method : methods) { System.out.println(method); } } }
루틴 2: 리플렉션을 통해 메서드 호출 리플렉션을 통해 메서드 호출. 자세한 내용은 코드와 설명을 참조하세요.
import java.lang.reflect.Method; public class InvokeTester { public int add(int param1, int param2) { return param1 + param2; } public String echo(String message) { return "Hello: " + message; } public static void main(String[] args) throws Exception { // 以前的常规执行手段 InvokeTester tester = new InvokeTester(); System.out.println(tester.add(1, 2)); System.out.println(tester.echo("Tom")); System.out.println("---------------------------"); // 通过反射的方式 // 第一步,获取Class对象 // 前面用的方法是:Class.forName()方法获取 // 这里用第二种方法,类名.class Class<?> classType = InvokeTester.class; // 生成新的对象:用newInstance()方法 Object invokeTester = classType.newInstance(); System.out.println(invokeTester instanceof InvokeTester); // 输出true // 通过反射调用方法 // 首先需要获得与该方法对应的Method对象 Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组 // 调用目标方法 Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 }); System.out.println(result); // 此时result是Integer类型 //调用第二个方法 Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class}); Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"}); System.out.println(result2); } }객체 생성
1 먼저 Class 객체를 가져온 다음. 클래스 객체 전달 클래스의 newInstance() 메소드에는 매개변수가 없는 생성자와 매개변수가 있는 생성자가 있습니다.
Class<?> classType = String.class; Object obj = classType.newInstance();
클래스의 매개변수가 있는 생성자를 통해 객체를 생성하려면 다음 메소드만 사용할 수 있습니다.
(고객 A 사용자 정의 클래스에는 매개변수 없는 생성자와 매개변수화된 생성자가 있으며 문자열과 정수를 전달합니다.)
Class<?> classType = Customer.class; Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class}); Object obj2 = cons2.newInstance(new Object[] {"ZhangSan",20});
可以看出调用构造方法生成对象的方法和调用一般方法的类似,不同的是从Class对象获取Constructor对象时不需要指定名字,而获取Method对象时需要指定名字。
相关视频教程推荐:Java视频教程
위 내용은 자바에서 리플렉션이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!