>  기사  >  Java  >  Java 반사 메커니즘 분석 가이드

Java 반사 메커니즘 분석 가이드

黄舟
黄舟원래의
2017-02-06 16:17:421309검색

1. JAVA는 동적 언어인가요?

일반적으로 동적 언어의 경우 프로그램이 실행되는 동안 프로그램 구조나 변수 유형을 변경할 수 있다는 의미입니다. 이러한 관점에서 JAVA는 C++와 마찬가지로 동적 언어가 아닙니다. 동적 언어.

하지만 JAVA에는 리플렉션이라는 매우 중요한 동적 관련 메커니즘이 있습니다. 리플렉션을 통해 Java는 런타임 시 컴파일 중에 완전히 합산된 클래스를 로드, 감지 및 사용할 수 있으며 해당 개체 엔터티를 생성하고 해당 메서드를 호출하거나 속성에 대한 값을 설정할 수 있습니다. 따라서 Java는 반동적 언어로 간주됩니다.


반사 개념:


Java의 반사 메커니즘은 실행 상태에서 모든 클래스에 대해 , 이 클래스의 모든 속성과 메서드를 알 수 있습니다.


모든 개체에 대해 해당 메서드를 호출할 수 있습니다.


동적으로 정보를 얻고 객체 메소드를 동적으로 호출하는 기능을 Java 언어의 반영 메커니즘이라고 합니다


2. 동적 특성


2.1. 동적 특성


● 런타임 중 객체 인스턴스 생성

● 런타임 중 메서드 호출;

●런타임 시 속성 변경


2.2.Java 리플렉션 메커니즘이 달성할 수 있는 기능


●에 런타임 시 객체가 속한 클래스 결정

● 런타임 시 모든 클래스의 객체 생성

● 런타임 시 모든 클래스의 메서드 및 속성 결정

●호출 런타임 시 모든 개체의 메서드

●동적 프록시 생성

2.3.Java 반사 응용 시나리오

Java 프로그램의 많은 개체는 두 가지 유형이 있습니다. 및 런타임 유형

컴파일 타임 유형은 객체 선언 시 사용된 유형에 따라 결정되고, 런타임 유형은 객체에 실제로 할당된 유형에 따라 결정됩니다

예:

Person p =new Student();

컴파일 시 유형은 Person이고 런타임 시 Student

입니다. 또한 프로그램은 실행 시 외부에서 전달된 객체를 받을 수도 있습니다. 그러나 프로그램은 객체의 런타임 유형의 메서드를 호출해야 합니다. 이러한 문제를 해결하려면 프로그램은 런타임에 개체와 클래스에 대한 실제 정보를 검색해야 합니다. 그러나 객체와 클래스가 어떤 클래스에 속할지 컴파일 타임에 예측하는 것이 불가능하고 프로그램이 객체와 클래스의 실제 정보를 찾기 위해 런타임 정보에만 의존하는 경우 이때 리플렉션을 사용해야 합니다

3. Java Reflection API


Reflection API는 현재 JAVA 가상 머신의 클래스, 인터페이스 또는 객체에 대한 정보를 생성하는 데 사용됩니다.

●클래스 클래스: 클래스의 속성, 메서드, 기타 콘텐츠 정보를 얻을 수 있는 리플렉션의 핵심 클래스

●필드 클래스: Java.lang.reflect의 속성을 나타냅니다. 획득하고 설정할 수 있는 클래스 클래스의 속성 값입니다.

● 메소드 클래스: Java.lang.reflect. 클래스의 메소드에 대한 정보를 얻거나 메소드를 실행하는 데 사용할 수 있는 클래스의 메소드를 나타냅니다.

생성자 클래스: Java.lang.reflect. 클래스의 생성자 메서드를 나타냅니다.

4. 모든 메소드 및 속성 가져오기


Person 클래스

package com.pb.Reflect.classinfo;

public class Person {
private String name;
private String gender;
private int age;

private Person() {
//
}
public Person(String name, String gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
//getter、和setter方法
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public String toString(){
return "姓名:"+name+"年龄: "+age;
}

}

reflection 사용:

package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
* 通过用户输入类的全路径,来获取该类的成员方法和属性
* Declared获取全部不管是私有和公有
* 1.获取访问类的Class对象
* 2.调用Class对象的方法返回访问类的方法和属性信息
*/
public class ReflectDemo {

/*
* 构造方法
*/
public ReflectDemo(){
//用户输入类的全路径径
//使用String组件
String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径");
//使用Class.forName方法根据输入的类的全路径 返回该类的Class对象
try {
Class cla = Class.forName(classpsth);
//利用Class对象的cla的自审,返回方法对象集合
Method [] method=cla.getDeclaredMethods(); //返回所有的方法
System.out.println("========获取方法信息============");
for (Method meth : method) {
//遍历method数组,并输出方法信息
System.out.println(meth.toString());
}
System.out.println("========获取出方法信息结束============");
//获取属性利用Class对象的cla的自审,返回成员属性对象集合
Field [] field=cla.getDeclaredFields();
System.out.println("========获取成员属性信息============");
for (Field f : field) {
System.out.println(f.toString());
}
System.out.println("========获取成员属性信息结束============");
//获取属性利用Class对象的cla的自审,返回构造方法集合
Constructor [] constructor=cla.getDeclaredConstructors();
System.out.println("========获取成员构造方法信息============");
for (Constructor constru : constructor) {
System.out.println(constru.toString());
}
System.out.println("========获取成员构造方法信息结束============");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("路径输入错误!");
}
}

}
rrree

com을 입력합니다. pb.Reflect.classinfo.Person

결과:

package com.pb.Reflect.classinfo;

public class TestReflection {

public static void main(String[] args) {
ReflectDemo rd=new ReflectDemo();

}

}

위 내용은 Java Reflection 메커니즘 분석 가이드 내용이며, 더 많은 관련 내용은 PHP 중국어 홈페이지(www.kr)를 참고하시기 바랍니다. .php.cn)!


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