> Java > Java시작하기 > 본문

자바에서 리플렉션이란 무엇입니까?

青灯夜游
풀어 주다: 2023-01-13 00:40:09
원래의
18453명이 탐색했습니다.

Java에서 리플렉션은 주로 프로그램이 자체 상태나 동작에 액세스하고 이를 감지하고 수정하는 능력을 의미합니다. Java 반사 메커니즘의 주요 기능은 다음과 같습니다. 1. 런타임 시 객체가 속한 클래스를 결정합니다. 2. 런타임 시 모든 클래스의 객체를 구성합니다. 3. 런타임 시 객체의 메서드를 호출합니다.

자바에서 리플렉션이란 무엇입니까?

이 튜토리얼의 운영 환경: windows7 시스템, java8 버전, DELL G3 컴퓨터.

Reflection이란 무엇인가요?

주로 프로그램의 자체 상태나 동작에 액세스, 감지 및 수정하는 능력을 말합니다.

Java 리플렉션?

Java 런타임 환경에서 모든 클래스에 대해 이 클래스가 어떤 속성과 메서드를 가지고 있는지 알 수 있나요? 모든 개체에 대해 해당 메서드를 호출할 수 있습니까? Java 반사 메커니즘은 주로 다음 기능을 제공합니다.

 * 1. 런타임 시 개체가 속하는 클래스를 결정합니다.

 * 2. 런타임에 모든 클래스의 객체를 생성합니다.

 * 3. 런타임 시 모든 클래스의 멤버 변수와 메서드를 결정합니다.

 * 4. 런타임에 객체의 메서드를 호출합니다.


Reflectio

리플렉션은 동적(또는 준동적) 언어로 간주되는 Java의 핵심 속성입니다.

이 메커니즘을 통해 프로그램은 런타임 시 Reflection API를 통해 알려진 이름을 가진 모든 클래스의 내부 정보를 얻을 수 있습니다.

해당 수정자(예: public, static 등), 슈퍼클래스(예: Object), 구현된 인터페이스(예: 직렬화 가능)는 물론 해당 필드와 메서드에 대한 모든 정보를 포함하고 필드 내용을 변경할 수 있습니다. 런타임에 메서드를 호출합니다.

동적 언어

 동적 언어의 정의 "프로그램이 실행될 때 프로그램의 구조나 변수의 종류를 변경할 수 있게 해주는 언어입니다. 이 언어를 동적 언어라고 합니다."

 이러한 관점에서 Perl, Python, Ruby는 동적 언어인 반면 C++, Java, C#은 동적 언어가 아닙니다.

Java는 이 정의와 분류에 따른 동적 언어는 아니지만 매우 눈에 띄는 동적 관련 메커니즘인 Reflection을 가지고 있습니다. 이 단어는 반사, 이미지, 반사를 의미합니다. Java에서 사용되면 컴파일 중에 전혀 알려지지 않은 클래스를 런타임에 로드, 감지 및 사용할 수 있음을 의미합니다.

 즉, Java 프로그램은 런타임에만 이름이 알려진 클래스를 로드하고, 전체 구조를 학습하고(메소드 정의는 포함하지 않음) 객체 엔터티를 생성하거나 해당 필드에 대한 값을 설정하거나 호출할 수 있습니다. 그 방법.

  이러한 자기 자신을 성찰하는 프로그램의 능력을 인트로스펙션(introspection, introspection, introspection)이라고 합니다. 성찰과 성찰은 자주 함께 언급되는 두 가지 용어입니다.

Java Reflection API 소개

JDK에서 Java 리플렉션 메커니즘은 주로 다음 클래스로 구현됩니다. 이러한 클래스(첫 번째 클래스 제외)는 모두 java.lang.reflect 패키지

클래스 클래스에 있습니다. : 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿