반성이란 무엇인가요?
주로 프로그램이 자체 상태나 동작에 액세스하고 이를 감지하고 수정하는 능력을 나타냅니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!