一般而言,說(shuō)到動(dòng)態(tài)言,都是指在程序運(yùn)行時(shí)允許改變程序結(jié)構(gòu)或者變量類(lèi)型,從這個(gè)觀點(diǎn)看,JAVA和C++一樣,都不是動(dòng)態(tài)語(yǔ)言。
但JAVA它卻有著一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制:反射。通過(guò)反射,Java可以于運(yùn)行時(shí)加載、探知和使用編譯期間完全求和的類(lèi)、生成其對(duì)象實(shí)體,調(diào)用其方法或者對(duì)屬性設(shè)值。所以Java算是一個(gè)半動(dòng)態(tài)的語(yǔ)言吧。
反射的概念:
在Java中的反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;
對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;
這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱(chēng)為Java語(yǔ)言的反射機(jī)制
二、動(dòng)態(tài)性質(zhì)2.1、動(dòng)態(tài)性質(zhì)在Java程序中許多對(duì)象在運(yùn)行時(shí)都會(huì)出現(xiàn)兩種類(lèi)型:編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型
編譯時(shí)的類(lèi)型由聲明該對(duì)象時(shí)使用的類(lèi)型決定,運(yùn)行時(shí)的類(lèi)型由實(shí)際賦給對(duì)象的類(lèi)型決定
如:
Person p =new Student();
編譯時(shí)類(lèi)型為Person,而運(yùn)行時(shí)為Student
除此之外,程序在運(yùn)行時(shí)還可能接收到外部傳入的一個(gè)對(duì)象,該對(duì)象的編譯時(shí)類(lèi)型為Object,但程序又需要調(diào)用該對(duì)象運(yùn)行時(shí)類(lèi)型的方法。為了這些問(wèn)題程序需要在運(yùn)行時(shí)發(fā)現(xiàn)對(duì)象和類(lèi)的真實(shí)信息。然而,如果編譯時(shí)根本無(wú)法預(yù)知該對(duì)象和類(lèi)可能屬于哪些類(lèi),程序只依靠運(yùn)行時(shí)信息來(lái)發(fā)現(xiàn)該對(duì)象和類(lèi)的真實(shí)信息,此時(shí)就必須使用反射
三、Java反射API反射API用來(lái)生成在當(dāng)前JAVA虛擬機(jī)中的類(lèi)、接口或者對(duì)象的信息。
Person類(lèi)
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;/* * 通過(guò)用戶(hù)輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性 * Declared獲取全部不管是私有和公有 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息 */public class ReflectDemo { /* * 構(gòu)造方法 */ public ReflectDemo(){ //用戶(hù)輸入類(lèi)的全路徑徑 //使用String組件 String classpsth=JOptionPane.showInputDialog(null,"輸入類(lèi)的全路徑"); //使用Class.forName方法根據(jù)輸入的類(lèi)的全路徑 返回該類(lèi)的Class對(duì)象 try { Class cla = Class.forName(classpsth); //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========獲取方法信息============"); for (Method meth : method) { //遍歷method數(shù)組,并輸出方法信息 System.out.println(meth.toString()); } System.out.println("========獲取出方法信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========獲取成員屬性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========獲取成員屬性信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========獲取成員構(gòu)造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("路徑輸入錯(cuò)誤!"); } } }測(cè)試類(lèi):
package com.pb.Reflect.classinfo;public class TestReflection { public static void main(String[] args) { ReflectDemo rd=new ReflectDemo(); }}輸入com.pb.Reflect.classinfo.Person
結(jié)果:
========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取構(gòu)造方法信息============private com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取構(gòu)造方法信息結(jié)束============五、使用反射的步驟5.1、步驟
Java.lang.reflect
Person p = new Person();Class cla=p.getClass();
Class cls=Person.class;
Class cla=Class.forName(“類(lèi)的全路徑”);六、第二種方式對(duì)象的getClass()方法
Person類(lèi),因?yàn)橐暶鲗?duì)象所以將構(gòu)造方法public
package com.pb.Reflect.classinfo;public class Person { private String name; private String gender; private int age; public 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;/* * 通過(guò)用戶(hù)輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性 * Declared獲取全部不管是私有和公有 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息 */ public ReflectDemo(Person p){ Class cla=p.getClass(); //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========獲取方法信息============"); for (Method meth : method) { //遍歷method數(shù)組,并輸出方法信息 System.out.println(meth.toString()); } System.out.println("========獲取出方法信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========獲取成員屬性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========獲取成員屬性信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========獲取成員構(gòu)造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============"); } }測(cè)試類(lèi)
package com.pb.Reflect.classinfo;public class TestReflection { public static void main(String[] args) { Person p=new Person(); ReflectDemo rd=new ReflectDemo(p); }}結(jié)果:同上
========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取成員構(gòu)造方法信息============public com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取成員構(gòu)造方法信息結(jié)束============七、第三種方法類(lèi)的.class屬性
Person類(lèi)同上
測(cè)試類(lèi):
package com.pb.Reflect.classinfo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class TestReflection { public static void main(String[] args) { /*第二種方法 Person p=new Person(); ReflectDemo rd=new ReflectDemo(p);*/ /* * 第三種方式.class屬性 */ Class cla=Person.class; //利用Class對(duì)象的cla的自審,返回方法對(duì)象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========獲取方法信息============"); for (Method meth : method) { //遍歷method數(shù)組,并輸出方法信息 System.out.println(meth.toString()); } System.out.println("========獲取出方法信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回成員屬性對(duì)象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========獲取成員屬性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========獲取成員屬性信息結(jié)束============"); //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========獲取成員構(gòu)造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========獲取成員構(gòu)造方法信息結(jié)束============"); }}結(jié)果:
同上
========獲取方法信息============public java.lang.String com.pb.Reflect.classinfo.Person.getGender()public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)public int com.pb.Reflect.classinfo.Person.getAge()public void com.pb.Reflect.classinfo.Person.setAge(int)public java.lang.String com.pb.Reflect.classinfo.Person.toString()private java.lang.String com.pb.Reflect.classinfo.Person.getName()private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)========獲取出方法信息結(jié)束====================獲取成員屬性信息============private java.lang.String com.pb.Reflect.classinfo.Person.nameprivate java.lang.String com.pb.Reflect.classinfo.Person.genderprivate int com.pb.Reflect.classinfo.Person.age========獲取成員屬性信息結(jié)束====================獲取成員構(gòu)造方法信息============public com.pb.Reflect.classinfo.Person()public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)========獲取成員構(gòu)造方法信息結(jié)束============
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注