| No. | 方法 | 類型 | 描述 |
| 1 | public static Class<?> forName(String className) throws ClassNotFoundException | 普通 | 傳入完整的“包.類”名稱實(shí)例化Class對象 |
| 2 | public Constructor[] getConstructors() throws SecurityException | 普通 | 得到一個(gè)類中的全部構(gòu)造方法 |
| 3 | public Field[] getDeclaredFields() throws SecurityException | 普通 | 得到一個(gè)類父類中的全部屬性 |
| 4 | public Field[] getFields() throws SecurityException | 普通 | 取得本類的全部屬性 |
| 5 | public Method[] getMethods() throws SecurityException | 普通 | 得到一個(gè)類中的全部方法 |
| 6 | public Method getMethod(String name,Class... parameterTypes)throws NoSuchMethodException,SecurityException | 普通 | 返回一個(gè)Method對象,并設(shè)置一個(gè)方法中的所有參數(shù)類型 |
| 7 | public Class[] getInterfaces() | 普通 | 得到一個(gè)類中所實(shí)現(xiàn)的全部接口 |
| 8 | public String getName() | 普通 | 得到一個(gè)類完整的“包.類”名稱 |
| 9 | public Package getPackage() | 普通 | 得到一個(gè)類的包 |
| 10 | public Class getSuperclass() | 普通 | 得到一個(gè)類的父類 |
| 11 | public Object newInstance() throws InstantiationException,IllegalaccessException | 普通 | 根據(jù)Class定義的類實(shí)例化對象 |
| 12 | public Class<?> getComponentType() | 普通 | 返回表示數(shù)組類型的Class |
| 13 | public boolean isArray() | 普通 | 判斷此Class是否是一個(gè)數(shù)組 |


package com.pb.reflect;/* * 1.包 * 2.注解 * 3.構(gòu)造方法 * 4.方法 * 5.內(nèi)部類 */@DePRecatedpublic class ReflectDemo2 { //私有的構(gòu)造方法 private ReflectDemo2(){}; //公有的帶一個(gè)一個(gè)name屬性的構(gòu)造方法 public ReflectDemo2(String name){ }; //無參數(shù)的info方法 public void info(){}; //有參數(shù)的info方法 public void info(String str){}; //內(nèi)部類 class inner{}; }
測試類
package demo;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import com.pb.reflect.ReflectDemo2;public class Demo3 { public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException { //獲取ReflectDemo2的Class對象 Class<ReflectDemo2> cla=ReflectDemo2.class; //獲取ReflectDemo2中全部構(gòu)造方法 Constructor[] constructors=cla.getDeclaredConstructors(); for (Constructor con : constructors) { System.out.println(con); } //獲取指定的公有構(gòu)造方法 System.out.println("====獲取指定的公有構(gòu)造方法========"); Constructor [] pub=cla.getConstructors(); for (Constructor c : pub) { System.out.println(c.toString()); } //獲取公有的方法 System.out.println("====獲取公有的方法======"); Method [] methods=cla.getMethods(); for (Method meth : methods) { System.out.println(meth.toString()); } //獲取指定方法 System.out.println("====獲取指定的的方法======"); //獲取info不帶參數(shù)方法 Method method=cla.getMethod("info",null); System.out.println(method.toString()); //獲取info帶一個(gè)String參數(shù)的方法 Method meth=cla.getMethod("info", String.class); System.out.println(meth.toString()); System.out.println("=====獲取注釋======="); Annotation [] annotations=cla.getAnnotations(); for (Annotation anno : annotations) { System.out.println(anno.toString()); } //獲取得包信息 System.out.println("=====獲取得包信息======="); Package pack=cla.getPackage(); System.out.println(pack.toString()); //獲取內(nèi)部類 System.out.println("=====獲取內(nèi)部類======="); Class [] clas=cla.getDeclaredClasses(); for (Class c : clas) { System.out.println(c.toString()); } System.out.println("=====獲取父類======="); Class class2=cla.getSuperclass(); System.out.println(class2.toString()); //獲取內(nèi)部類的對象 Class innercla=Class.forName("com.pb.reflect.ReflectDemo2$inner"); System.out.println("內(nèi)部類對應(yīng)的外部類:"+innercla.getDeclaringClass()); System.out.println("內(nèi)部類的包:"+innercla.getPackage()); System.out.println("內(nèi)部類的父類:"+innercla.getSuperclass()); }}四、創(chuàng)建對象
直接使用newInstance方法創(chuàng)建對象
package demo;import java.util.Date;public class Demo4 { public static void main(String[] args) throws InstantiationException, IllegalAccessException { //獲取Date類的Class對象 Class cla=Date.class; //使用newInstrance方法創(chuàng)建對象 Date date=(Date) cla.newInstance(); System.out.println(date.toString()); }}指定的構(gòu)造方法創(chuàng)建對象
package demo;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.util.Date;public class Demo4 { public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { //獲取Date類的Class對象 Class cla=Date.class; //獲取指定參數(shù)的構(gòu)造方法帶一個(gè)長整型參數(shù)的構(gòu)造方法 Constructor constructor=cla.getConstructor(long.class); //使用newInstrance方法創(chuàng)建對象 Date date=(Date) constructor.newInstance(1999); System.out.println(date.toString()); }}五、調(diào)用方法

package com.pb.reflect;public class Person { private String name; private String gender; private int age; public String getName() { return name; } public 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 getSay(){ return this.name+" /t"+this.gender+"/t"+this.age; }}測試類
package demo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import com.pb.reflect.Person;public class Demo6 { public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { //得到Person類的Class對象 Class cla=Person.class; //聲明一個(gè)Person對象 Person p=new Person(); //調(diào)用setName方法 Method method=cla.getMethod("setName", String.class); //使用invoke賦值 method.invoke(p, "張三"); //調(diào)用setGender方法 Method setGender=cla.getMethod("setGender", String.class); setGender.invoke(p, "女"); //調(diào)用setAge方法 Method setAge=cla.getMethod("setAge", int.class); setAge.invoke(p, 23); //調(diào)用get方法 get方法沒有參數(shù)設(shè)置為null Method getName=cla.getMethod("getName", null); Object o=getName.invoke(p, null); System.out.println(o.toString()); Method getGender=cla.getMethod("getGender", null); Object o1=getGender.invoke(p, null); System.out.println(o1.toString()); Method getAge=cla.getMethod("getAge", null); Object o2=getAge.invoke(p, null); System.out.println(o2.toString()); Method say=cla.getMethod("getSay", null); Object o3=say.invoke(p, null); System.out.println(o3.toString()); }}結(jié)果:
張三女23張三 女 23




package com.pb.reflect;public class Person { private String name; private String gender; private int age; public String getName() { return name; } public 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 getSay(){ return"姓名:"+this.name+" /t性別:"+this.gender+"/t年齡:"+this.age; }}測試類
package demo1;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Calendar;import com.pb.reflect.Person;public class Test2 { public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { //聲明Person對象 Person p=new Person(); //通過反射重到Person的Class對象 Class cla=Person.class; //因?yàn)镻erson類的屬性都是私有的要用getDeclaredField Field name=cla.getDeclaredField("name"); //臨時(shí)取消權(quán)限檢查 name.setAccessible(true); name.set(p, "張三豐"); //獲取年齡 Field gender=cla.getDeclaredField("gender"); //臨時(shí)取消權(quán)限檢查 gender.setAccessible(true); //賦值 gender.set(p, "男"); //獲取年齡 Field age=cla.getDeclaredField("age"); age.setAccessible(true); age.setInt(p, 108); //獲取say方法 Method getSay=cla.getMethod("getSay", null); Object o=getSay.invoke(p, null); System.out.println(o.toString()); }}實(shí)際在在使用已知類時(shí)沒有必要使用反射,只有在程序需要?jiǎng)討B(tài)創(chuàng)建某個(gè)類的對象的時(shí)候我們才會(huì)考慮使用反射
七、動(dòng)態(tài)創(chuàng)建和訪問數(shù)組

package demo1;import java.lang.reflect.Array;public class ArrayTest1 { /** * 動(dòng)態(tài)創(chuàng)建數(shù)組和訪問數(shù)組 */ public static void main(String[] args) { //創(chuàng)建一個(gè)類型為String 的數(shù)組長度為10 Object arr=Array.newInstance(String.class, 10); //依次為arr賦值 Array.set(arr, 0, "一"); Array.set(arr, 1, "二"); Array.set(arr, 2, "三"); Array.set(arr, 3, "四"); Array.set(arr, 4, "五"); Array.set(arr,5, "六"); Array.set(arr, 6, "七"); Array.set(arr, 7, "八"); Array.set(arr, 8, "九"); Array.set(arr, 9, "十"); //獲取值 Object o8=Array.get(arr, 8); System.out.println("數(shù)組 中下標(biāo)為8的值為"+o8); Object o2=Array.get(arr, 2); System.out.println("數(shù)組 中下標(biāo)為2的值為"+o2); }}public static void main(String[] args) { // 創(chuàng)建一個(gè)一維數(shù)組 Object arr1=Array.newInstance(int.class, 10); //為下標(biāo)為5,和8的賦值 Array.setInt(arr1, 5, 5); Array.setInt(arr1, 8, 8); //查看相應(yīng)位置的內(nèi)容 System.out.println(Array.get(arr1, 5)); System.out.println(Array.get(arr1, 8)); }創(chuàng)建多維數(shù)組
package demo1;import java.lang.reflect.Array;public class ArrayTest2 { /** * 使用Array類創(chuàng)建二維數(shù)組 */ public static void main(String[] args) { // 創(chuàng)建一個(gè)二維數(shù)組5,10 Object arr1=Array.newInstance(String.class, 5,10); //為二維數(shù)組賦值 //首先獲取一維的維靈敏 Object firstIndex=Array.get(arr1, 4); //4,6賦值 Array.set(firstIndex, 6,"張三"); //為3,8賦值 Object new_firstindex=Array.get(arr1, 3); Array.set(new_firstindex, 8, "李四"); //值輸出 //將arr1數(shù)組強(qiáng)轉(zhuǎn)為2維數(shù)組 String [][] str=(String [][])arr1; System.out.println(str[4][6]); System.out.println(str[3][8]); }}新聞熱點(diǎn)
疑難解答
圖片精選