一、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。表示類別的構造方法。
四、取得全部方法和屬性
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(); } }