首頁 >Java >java教程 >Java反射機制分析指南

Java反射機制分析指南

黄舟
黄舟原創
2017-02-06 16:17:421333瀏覽

一、JAVA是動態語言嗎?

一般而言,說到動態言,都是指在程式運行時允許改變程式結構或變數類型,從這個觀點來看,JAVA和C++一樣,都不是動態語言。

但JAVA它有著非常突出的動態相關機制:反射。透過反射,Java可以於執行時期載入、探知和使用編譯期間完全求和的類別、產生其物件實體,呼叫其方法或對屬性設值。所以Java算是一個半動態的語言吧。


反射的概念:


在Java中的反射機制是指在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;





一個對象,都能夠呼叫它的任意一個方法;


這種動態獲取資訊以及動態調用對象方法的函數稱為Java語言的反射機制

二、動態性質


二、動態性質

2.1、動態性質


●運行時產生物件實例;

●運作期間呼叫方法;

●運行時更改屬性

2.運行時更改屬性

2. ●在運行時判斷任意一個物件所屬的類別

●在運行時構造任意一個類別的物件

●在運行時判斷任意懷個類別所具有的方法和屬性

●在運行時呼叫任意一個物件的方法

●產生動態代理

2.3、Java反射應用場合


在Java程式中許多物件在運行時都會出現兩種類型:編譯時類型和運行時類型

編譯時的類型由聲明該物件時使用的類型決定,運行時的類型由實際賦給對象的類型決定

如:

Person p =new Student();

編譯時類型為Person,而運行時為Student

除此之外,程序在運行時還可能接收到外部傳入的一個對象,該對象的編譯時類型為Object,但程式又需要呼叫該對象執行時間類型的方法。為了這些問題程式需要在運行時發現物件和類別的真實資訊。然而,如果編譯時根本無法預知該物件和類別可能屬於哪些類,程式只依靠執行時間資訊來發現該物件和類別的真實訊息,此時就必須使用反射

三、Java反射API


反射API用來產生在目前JAVA虛擬機器中的類別、介面或物件的資訊。

●Class類:反射的核心類,可以取得類別的屬性,方法等內容資訊

●Field類別:Java.lang.reflect.表示類別的屬性,可以取得並設定類別的中屬性值。

●Method類別:Java.lang.reflect。表示類別的方法,它可以用來取得類別中方法的資訊或執行方法

Construcor類別:Java.lang.reflect。表示類別的構造方法。

四、取得全部方法和屬性


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

}
🎜使用反射:🎜
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("路径输入错误!");
}
}

}
package com.pb.Reflect.classinfo;

public class TestReflection {

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

}

}
🎜輸入com.pb.Reflect.classinfo.內容,更多相關內容請關注PHP中文網(m.sbmmt.com)! 🎜🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn