1.1、概述
反射的概念:
在java中的反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;
對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;
這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為Java語言的反射機(jī)制
2.1、3種方式
1.聲明對(duì)象如Person p=new Person,通過對(duì)象的p.getClass()方法
2.每個(gè)類都有一個(gè).class屬性,通過Person.class屬性
3.Class.fromName("類的全路徑"),全路徑包名.類名
2.2、示例
普通的JAVA類,經(jīng)過了一些修改有私有的方法與公有的方法
package com.pb.entity;public class Person{ PRivate String name; //姓名 private String gender;//性別 private int age; //年齡 public Person() { //公開無參數(shù)構(gòu)造方法 System.out.println("公開無參數(shù)構(gòu)造方法"); } public Person(String name,String gender,int age) { //公開有參數(shù)構(gòu)造方法 System.out.println("公開有參數(shù)構(gòu)造方法"); this.name=name; this.gender=gender; this.age=age; } //私有構(gòu)造方法 private Person(String name) { System.out.println("這是私有的只有name的構(gòu)造方法:"+name); } //私有構(gòu)造方法 private Person(String name,int age) { System.out.println("這是私有的只有name和age的構(gòu)造方法:"+name+"...."+age); } /* getter、setter方法 */ public void setName(String name) { this.name=name; } public String getName() { return this.name; } public void setGender(String gender) { this.gender=gender; } public String getGender() { return this.gender; } /* 靜態(tài)方法 */ public static void staticMethod() { System.out.println("這是一個(gè)staticMethod方法"); } /* 私有化方法 */ private void setAge(int age) { this.age=age; } private int getAge() { return this.age; } /* 私有的方法 */ private void test() { System.out.println("這是私有的test方法"); } /* 私有的方法 */ private void test(String name,String gender) { System.out.println("這是私有的有參數(shù)的方法"+name+"..."+gender); } /* 自我介紹的方法 */ public void show() { System.out.println("姓名:"+this.name+",性別:"+this.gender+",年齡:"+this.age); }}
測(cè)試類

package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;/*反射的三種方式:1.類.class2.聲明對(duì)象,對(duì)象.getClass()方法如Person p=new Person(); p.getClass();3.Class.forName("類的全路徑");*/class ReflectionDemo1{ public static void main(String[] args) throws Exception { reflect_fun1(); System.out.println("========================="); reflect_fun2(); System.out.println("========================="); reflect_fun3(); System.out.println("========================="); } /* 類.class */ public static void reflect_fun1() { //獲取類對(duì)象,得到一個(gè)Class對(duì)象 Class cla1=Person.class; Class cla2=Person.class; System.out.println(cla1==cla2); } /* 聲明對(duì)象,對(duì)象.getClass()方法如Person p=new Person(); p.getClass(); */ public static void reflect_fun2() { Person p1=new Person(); //通過對(duì)象的getClass()方法 Class cla1=p1.getClass(); Person p2=new Person(); Class cla2=p2.getClass(); System.out.println(cla1==cla2); } /* Class.forName("類的全路徑"); */ public static void reflect_fun3() throws Exception { Class cla1=Class.forName("com.pb.entity.Person"); System.out.println(cla1); }}
3.1、概述
構(gòu)造方法:
方法:
屬性:
3.2、示例
package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;/*獲取公開構(gòu)造方法獲取私有構(gòu)造方法獲取公開的方法獲取私有的方法*/class ReflectionDemo1 { public static void main(String[] args) throws Exception { getObj_con1(); System.out.println("========================="); getObj_con2(); System.out.println("========================="); getObj_con3(); System.out.println("========================="); getObj_con4(); System.out.println("========================="); getObj_meth1(); System.out.println("========================="); getObj_meth2(); System.out.println("========================="); getField_meth1(); System.out.println("========================="); } /* * 獲取公開構(gòu)造方法 */ public static void getObj_con1() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); // 獲取無參數(shù)的構(gòu)造方法 Constructor<Person> con = cla.getConstructor(); System.out.println(con); // 獲取指定參數(shù)的構(gòu)造方法有3個(gè)參數(shù)的構(gòu)造方法 Constructor<Person> cons = cla.getConstructor(String.class, String.class, int.class); System.out.println(cons); } /* * 獲取私有構(gòu)造方法 */ public static void getObj_con2() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); //獲取私有一個(gè)參數(shù)的構(gòu)造方法 Constructor<Person> con1=cla.getDeclaredConstructor(String.class); System.out.println(con1); //獲取私有2個(gè)參數(shù)的構(gòu)造方法 Constructor<Person> con2=cla.getDeclaredConstructor(String.class,int.class); System.out.println(con2); } /* * 獲取全部公有構(gòu)造方法 */ public static void getObj_con3() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); Constructor [] cons=cla.getConstructors(); //遍歷 for(Constructor c:cons) { System.out.println(c); } } /* * 獲取全部構(gòu)造方法包括私有 */ public static void getObj_con4() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); Constructor [] cons=cla.getDeclaredConstructors(); //遍歷 for(Constructor c:cons) { System.out.println(c); } } /* * 獲取公開的方法 */ public static void getObj_meth1() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); //獲取方法名為show的公開方法 Method m1=cla.getMethod("show"); System.out.println(m1); //獲取setName的方法 Method m2=cla.getMethod("setName", String.class); System.out.println(m2); //獲取所有公開的方法包括從Object中繼承的方法 Method [] ms=cla.getMethods(); //遍歷 for(Method m:ms) { System.out.println(m); } } /* * 獲取私有的方法 */ public static void getObj_meth2() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); //獲取指定的私有方法名字為test,有2個(gè)字符串參數(shù) Method m1=cla.getDeclaredMethod("test", String.class,String.class); System.out.println(m1); //也可以獲取SET和get方法 Method m2=cla.getDeclaredMethod("getAge"); System.out.println(m2); //獲取全部方法包含私有 Method [] ms=cla.getDeclaredMethods(); //遍歷 for(Method m:ms) { System.out.println(m); } } /* * 獲取屬性 */ public static void getField_meth1() throws Exception{ Class cla = Class.forName("com.pb.entity.Person"); //獲取指定的屬性 Field f1=cla.getDeclaredField("name"); System.out.println(f1); //有公開的話直接cla.getField(name) //獲取所有屬性 Field [] fs=cla.getDeclaredFields(); for(Field f:fs){ System.out.println(f); } }}
結(jié)果
public com.pb.entity.Person()public com.pb.entity.Person(java.lang.String,java.lang.String,int)=========================private com.pb.entity.Person(java.lang.String)private com.pb.entity.Person(java.lang.String,int)=========================public com.pb.entity.Person(java.lang.String,java.lang.String,int)public com.pb.entity.Person()=========================public com.pb.entity.Person(java.lang.String,java.lang.String,int)public com.pb.entity.Person()private com.pb.entity.Person(java.lang.String)private com.pb.entity.Person(java.lang.String,int)=========================public void com.pb.entity.Person.show()public void com.pb.entity.Person.setName(java.lang.String)public void com.pb.entity.Person.show()public void com.pb.entity.Person.setGender(java.lang.String)public java.lang.String com.pb.entity.Person.getGender()public static void com.pb.entity.Person.staticMethod()public java.lang.String com.pb.entity.Person.getName()public void com.pb.entity.Person.setName(java.lang.String)public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public java.lang.String java.lang.Object.toString()public native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()=========================private void com.pb.entity.Person.test(java.lang.String,java.lang.String)private int com.pb.entity.Person.getAge()public void com.pb.entity.Person.show()private int com.pb.entity.Person.getAge()public void com.pb.entity.Person.setGender(java.lang.String)public java.lang.String com.pb.entity.Person.getGender()public static void com.pb.entity.Person.staticMethod()private void com.pb.entity.Person.setAge(int)public java.lang.String com.pb.entity.Person.getName()public void com.pb.entity.Person.setName(java.lang.String)private void com.pb.entity.Person.test(java.lang.String,java.lang.String)private void com.pb.entity.Person.test()=========================private java.lang.String com.pb.entity.Person.nameprivate java.lang.String com.pb.entity.Person.nameprivate java.lang.String com.pb.entity.Person.genderprivate int com.pb.entity.Person.age=========================
4.1、概述
兩種創(chuàng)建對(duì)象的方式
4.2、示例
package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;public class ReflectDemo2 { public static void main(String[] args) throws Exception{ createObj1(); System.out.println("==============="); createObj2(); System.out.println("==============="); } /* * 使用構(gòu)造方法創(chuàng)建對(duì)象 */ public static void createObj1() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); //獲取指定的構(gòu)造方法 3 個(gè)參數(shù)的參數(shù)方法 Constructor con=cla.getConstructor(String.class,String.class,int.class); Person p=(Person) con.newInstance("張三","男",20); p.show(); } /* * 使用newInstance創(chuàng)建對(duì)象 */ public static void createObj2() throws Exception { Class cla = Class.forName("com.pb.entity.Person"); Person p=(Person) cla.newInstance(); p.show(); }}
結(jié)果:
公開有參數(shù)構(gòu)造方法姓名:張三,性別:男,年齡:20===============公開無參數(shù)構(gòu)造方法姓名:null,性別:null,年齡:0===============
5.1、概述
invoke(Object obj, Object... args) Method 對(duì)象表示的底層方法。setaccessible(boolean flag) true表示可以設(shè)置,默認(rèn)為false
只針對(duì)私有private修飾的需要設(shè)置
5.2、示例
package com.pb.demo1;//導(dǎo)入類import com.pb.entity.Person;import java.lang.reflect.*;/** * * 使用反射,調(diào)用setter與getter方法 * */public class ReflectDemo3 { public static void main(String[] args)throws Exception { setAndGet(); } public static void setAndGet() throws Exception{ Class cla = Class.forName("com.pb.entity.Person"); //創(chuàng)建對(duì)象 Person p=(Person) cla.newInstance(); //獲取setter方法 Method setName=cla.getMethod("setName", String.class); //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值 setName.invoke(p, "張三"); Method setGender=cla.getMethod("setGender", String.class); //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值 setGender.invoke(p, "女"); Method setAge=cla.getDeclaredMethod("setAge", int.class); //因?yàn)槭撬接械陌褭?quán)限打開才開以賦值 setAge.setAccessible(true); //賦值,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)是要設(shè)置的值 setAge.invoke(p, 32); //獲取show方法 Method show=cla.getMethod("show"); //調(diào)用方法 show.invoke(p); //多個(gè)參數(shù),可以寫NULL,也可以不寫返回一個(gè)Objec類,這個(gè)方法因?yàn)橐呀?jīng)輸出 }}
6.1、概述
java.lang.reflect.Array

6.2、示例
/*通過反射創(chuàng)建數(shù)組創(chuàng)建一維數(shù)組或二維數(shù)組1.通過Array.netInstance(類型.class,長度1,....長度n)2.通過setXXX(數(shù)組名,下標(biāo),值)方法可以賦值3.通過getXXX(數(shù)組名,下標(biāo))方法可以獲取值*/import java.lang.reflect.*;class ReflectArray1 { public static void main(String[] args) { createArray1(); System.out.println("====================="); createArray2(); } /* 反射創(chuàng)建一個(gè)String類型長度為10的一維數(shù)組 */ public static void createArray1() { Object arr=Array.newInstance(String.class,10); //為其中一些下標(biāo)元素賦值 Array.set(arr,3,"hello"); Array.set(arr,5,"java"); Array.set(arr,7,"reflect"); Array.set(arr,8,"Array"); Array.set(arr,9,"!"); //獲取值 Object o0=Array.get(arr,0); Object o1=Array.get(arr,1); Object o2=Array.get(arr,2); Object o3=Array.get(arr,3); //下標(biāo)為3的元素 Object o4=Array.get(arr,4); Object o5=Array.get(arr,5); Object o6=Array.get(arr,6); Object o7=Array.get(arr,7); Object o8=Array.get(arr,8); Object o9=Array.get(arr,9); //強(qiáng)制轉(zhuǎn)換 String [] str=(String[])arr; for(String s:str) { System.out.println(s); } } /* 反射創(chuàng)建一個(gè)int類型長度為5,10的二維數(shù)組 */ public static void createArray2() { Object arr=Array.newInstance(int.class,5,10); //設(shè)置值 //獲取一數(shù)組的下標(biāo) Object firstIndex1=Array.get(arr,3); //為二維數(shù)組下標(biāo)一個(gè)元素設(shè)置值 Array.setInt(firstIndex1,6,9); Object firstIndex2=Array.get(arr,1); //為二維數(shù)組下標(biāo)一個(gè)元素設(shè)置值 Array.setInt(firstIndex2,2,2); //強(qiáng)轉(zhuǎn) int [] [] arrs=(int [] [])arr; for(int x=0;x<arrs.length;x++) { for(int y=0;y<arrs[x].length;y++){ System.out.print(arrs[x][y]+","); } System.out.println(); } }}

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注