java的反射機制一共分爲上下兩篇,上篇請參考:http://xinsz08.blog.51cto.com/10565212/1946912java
下篇主要講解:數組
1.利用反射技術獲取構造方法,並使用構造方法建立對象ide
2.使用反射技術快速建立對象測試
3.使用反射技術獲取成員方法,並執行方法this
4.反射技術小結.spa
1.使用反射技術獲取構造方法,並使用構造方法建立對象對象
實現步驟:blog
1.獲取class文件對象 (Class.forName)
繼承
2.使用class文件對象中的方法,解剖class文件獲取構造方法Constructor接口
3.使用構造方法Constructor中的方法newInstance執行構造方法建立對象
使用反射可以獲取的構造方法:(首先創建一個Person類,用於測試,見代碼實例1)
* public Person() 無參構造方法
* public Person(String name, int age, String sex) 全參構造方法
* private Person(String name, int age) 私有構造方法
代碼實例1-建立Person 類:
package cn.xins08.boke; public class Person { private String name; private int age; public String sex; static { System.out.println("靜態代碼塊"); } // 3.無參的構造方法 public Person() { super(); System.out.println("無參構造方法"); } public Person(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; System.out.println("滿參數構造方法"); } private Person(String name, int age) { super(); this.name = name; this.age = age; System.out.println("私有的構造方法"); } // 4.toString方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } private void method() { System.out.println("私有的method方法"); } // 2.公共的setter/getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
2.利用反射技術獲取Person類的構造方法及建立對象:
代碼實例2:
package cn.xins08.boke; import java.lang.reflect.Constructor; import cn.xins08.boke.Person; public class ReflectConstructor { public static void main(String[] args) throws Exception { //1.獲取class文件對象 Class clazz = Class.forName("cn.xins08.boke.Person"); // 2.使用class文件對象中的方法,獲取class文件構造方法 Constructor[] cons1 = clazz.getConstructors(); // 獲取多個須要用getConstructors,前面用Constructor[]數組來接收. // 獲取一個用Constructor[] cons =clazz.getConstructor(); 只有一個就無需遍歷 for (Constructor con : cons1) { System.out.println(con); } System.out.println("-------------------------------"); Constructor[] cons2 = clazz.getDeclaredConstructors(); for(Constructor con:cons2){ System.out.println(con); } //3.使用構造方法Constructor中的方法newInstacnce執行構造方法建立對象 Constructor con1 = clazz.getConstructor(); Object obj1=con1.newInstance(); System.out.println(obj1);//無參構造方法 Person [name=null, age=0, sex=null] Person p1=(Person) obj1; p1.setName("xinsz08"); System.out.println(p1);//Person [name=xinsz08, age=0, sex=null] } }
運行結果:
靜態代碼塊
public cn.xins08.boke.Person()
public cn.xins08.boke.Person(java.lang.String,int,java.lang.String)
-------------------------------
public cn.xins08.boke.Person()
public cn.xins08.boke.Person(java.lang.String,int,java.lang.String)
private cn.xins08.boke.Person(java.lang.String,int) (私有方法)
無參構造方法
Person [name=null, age=0, sex=null]
Person [name=xinsz08, age=0, sex=null]
3.使用反射技術快速建立對象(重點)
使用反射技術快速建立對象的前提:
Person類中必須有無參構造方法
構造方法的修飾符不能是私有,建議使用public,由於public的權重比較高.
只針對無參構造
原理:使用class類中的方法 newInstance() ,建立此對象所表示的類的一個新實例.
代碼實例3:
package cn.xins08.boke; public class Reflect_3 { public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.xins08.boke.Person"); Object obj = clazz.newInstance(); System.out.println(obj); } }
運行結果:
靜態代碼塊
無參構造方法
Person [name=null, age=0, sex=null]
4.使用反射技術獲取成員方法,並執行方法(重點):
實現步驟:
1.獲取類的class文件對象
2.使用class文件對象中的方法,獲取Method
method 有兩個方法:
Method[] getMethods() 返回公共的成員方法,包括繼承自父類的,重寫接口的方法
Method[] getDeclaredMethods() 包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法
代碼實例4:
package cn.xins08.boke; import java.lang.reflect.Method; public class ReflectMethod { public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.xins08.boke.Person"); // 使用class 文件對象中的方法獲取method Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method); // 可以返回公共,默認訪問和私有方法,可是獲取不到繼承的方法 } System.out.println("======我是分割線=============="); Method[] methodsD = clazz.getDeclaredMethods(); for (Method method : methodsD) { System.out.println(method);// } Object obj = clazz.newInstance(); Method getNameMethod = clazz.getMethod("getName"); System.out.println(getNameMethod); /* * 無參構造方法 public java.lang.String cn.xins08.boke.Person.getName() */ Object m1 = getNameMethod.invoke(obj); System.out.println(m1); Method setNameMethod = clazz.getMethod("setName", String.class); Object m2 =setNameMethod.invoke(obj, "xinsz08"); System.out.println(m2); //此處的setName 沒有返回值,由於返回類型爲void.因此m2的值爲null //咱們再次獲取name的值 m1=getNameMethod.invoke(obj); System.out.println(m1); //此時打印的就是xinsz08 } }
反射機制小結:
利用反射機制獲取Class文件對象:
三種方式:
經過Object類 getClass()方法獲取 Class對象
經過類名.class 方式 獲取 Class對象
經過反射的方式, Class.forName(String classname) 獲取Class對象
2.經過反射, 獲取類中的構造方法,並完成對象的建立.
獲取指定的構造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
獲取指定的public修飾的構造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
獲取指定的構造方法,包含私有的
獲取全部的構造方法:
public Constructor<?>[] getConstructors() 獲取全部的public 修飾的構造方法
public Constructor<?>[] getDeclaredConstructors() 獲取全部的構造方法,包含私有的
3. 經過反射獲取類中的構造方法,並完成對象的建立:
基本步驟:
1.獲取字節碼文件對象
2.經過字節碼文件對象 ,獲取到指定的構造方法
getConstructor(參數);
3.經過構造方法,建立對象
public T newInstance(Object... initargs)
私有構造方法,建立對象
1. 獲取字節碼文件對象
2. 經過字節碼文件對象 ,獲取到指定的構造方法
getDeclaredConstructor (參數);
3.經過構造方法,建立對象
public T newInstance(Object... initargs)
4.經過反射,獲取Class文件中的方法
獲取指定的方法
public Method getMethod(String name, Class<?>... parameterTypes)
獲取指定的public方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
獲取指定的任意方法,包含私有的
獲取全部的方法
public Method[] getMethods() 獲取本類與父類中全部public 修飾的方法
ublic Method[] getDeclaredMethods()獲取本類中全部的方法,包含私有的
經過反射,調用方法
基本步驟:
1.獲取Class對象
2.獲取構造方法,建立對象
3.獲取指定的public方法
4.執行方法