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

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

angryTom
angryTom원래의
2019-11-11 10:04:085429검색

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

반성이란 무엇인가요?

주로 프로그램이 자체 상태나 동작에 액세스하고 이를 감지하고 수정하는 능력을 나타냅니다.

Java 리플렉션이란 무엇인가요?

Java 리플렉션은 Java 프로그램의 실행 상태에서 모든 클래스에 대해 해당 객체에 대한 이 클래스의 모든 속성과 메서드를 얻을 수 있고 해당 속성과 메서드를 호출할 수 있음을 의미합니다. 클래스의 내용을 동적으로 획득하고 객체를 동적으로 호출하는 이러한 방법을 반사 메커니즘이라고 합니다.

Java 리플렉션 메커니즘은 주로 다음 기능을 제공합니다.

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

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

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

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

Java의 리플렉션 메커니즘은 주로 클래스 기능을 분석하는 데 사용됩니다. 런타임 시 프로그램이나 어셈블리에서 각 유형의 멤버 및 멤버 정보를 얻을 수 있습니다. 프로그램의 일반 객체 유형은 컴파일 중에 확인됩니다. Java의 리플렉션 메커니즘은 런타임 중에 객체를 동적으로 생성하고 해당 속성을 호출할 수 있습니다. 따라서 리플렉션의 핵심은 런타임 중에 클래스를 동적으로 로드하거나 메서드를 호출하여 속성에 액세스하는 것입니다. 실행 중인 개체가 누구인지 미리 알 필요가 없습니다.

Reflection은 다음과 같이 사용할 수 있습니다.

런타임에 모든 클래스의 객체를 구성합니다. 런타임에 객체의 클래스를 결정하고, 런타임에 특정 클래스의 인스턴스인지 여부를 얻습니다. , 상속을 포함하여 공용 메소드는 런타임 중에 모든 객체의 메소드를 호출합니다.

예:

a) 메서드 가져오기

루틴 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);
        }
    }
 
}

b) 리플렉션을 통한 메서드 호출

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);
 
    }
}

위 내용은 자바에서 리플렉션이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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