JAVA反射技術,在平時我們的開發中雖然很少會用到例如讀取配製文件可能就用到這個技術,但在我們所使用的框架源碼中是經常會用到的。
1、常用舉例:package com.test.instancedemo;class X{};public class GetClassDemo02{ public static void main(String args[]){ Class<?> c1 = null ; // 指定泛型 Class<?> c2 = null ; // 指定泛型 Class<?> c3 = null ; // 指定泛型 try{ // 以下的操作形式是在開發中最常用的一種形式 c1 = Class.forName("com.test.instancedemo.X") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } c2 = new X().getClass() ; // 通過Object類中的方法實例化 c3 = X.class ; // 通過類.class實例化 System.out.println("類名稱:" + c1.getName()) ; // 得到類的名稱 System.out.println("類名稱:" + c2.getName()) ; // 得到類的名稱 System.out.println("類名稱:" + c3.getName()) ; // 得到類的名稱 }};

2、反射如何操作對象:package com.test.instancedemo ;class Person{ private String name ; // name屬性 private int age ; // age屬性 public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public String toString(){ // 覆寫toString()方法 return "姓名:" + this.name + ",年齡:" + this.age ; }};public class InstanceDemo01{ public static void main(String args[]){ Class<?> c = null ; // 聲明Class對象 try{ c = Class.forName("com.test.instancedemo.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 聲明Person對象 try{ per = (Person)c.newInstance() ; // 實例化對象 }catch(Exception e){ e.printStackTrace() ; } per.setName("LXY") ; // 設置姓名 per.setAge(30) ; // 設置年齡 System.out.println(per) ; // 內容輸出,調用toString() }};

3、如何使用反射包package com.test.instancedemo.instancedemo ;import java.lang.reflect.Constructor ; // 導入反射機制包class Person{ private String name ; // name屬性 private int age ; // age屬性 public Person(String name,int age){ this.setName(name) ; this.setAge(age); } public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public String toString(){ // 覆寫toString()方法 return "姓名:" + this.name + ",年齡:" + this.age ; }};public class InstanceDemo03{ public static void main(String args[]){ Class<?> c = null ; // 聲明Class對象 try{ c = Class.forName("com.test.instancedemo.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 聲明Person對象 Constructor<?> cons[] = null ; cons = c.getConstructors() ; try{ per = (Person)cons[0].newInstance("LXY",30) ; // 實例化對象 }catch(Exception e){ e.printStackTrace() ; } System.out.println(per) ; // 內容輸出,調用toString() }};

4、使用實例1package com.test.instancedemo.factorydemo ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){ // 覆寫eat()方法 System.out.println("** 吃蘋果"); }};class Orange implements Fruit{ public void eat(){ System.out.println("** 吃橘子") ; }};class Factory{ public static Fruit getInstance(String className){ Fruit fruit = null ; try{ fruit = (Fruit)Class.forName(className).newInstance() ; }catch(Exception e){ e.printStackTrace() ; } return fruit ; }};public class FactoryDemo01{ public static void main(String args[]){ Fruit f = Factory.getInstance("com.test.instancedemo.factorydemo.Apple") ; if(f!=null){ f.eat() ; } }};

4、使用實例2package com.test.instancedemo.factorydemo ;import java.util.Properties ;import java.io.File ;import java.io.FileOutputStream ;import java.io.FileInputStream ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){ // 覆寫eat()方法 System.out.println("** 吃蘋果"); }};class Orange implements Fruit{ public void eat(){ System.out.println("** 吃橘子") ; }};class Init{ public static Properties getPro(){ Properties pro = new Properties() ; File f = new File("d:\\fruit.properties") ; // 找到屬性文件 try{ if(f.exists()){ // 文件存在 pro.load(new FileInputStream(f)) ; // 讀取屬性 }else{ pro.setProperty("apple"," com.test.instancedemo.factorydemo.Apple") ; pro.setProperty("orange"," com.test.instancedemo.factorydemo.Orange") ; pro.store(new FileOutputStream(f),"FRUIT CLASS") ; } }catch(Exception e){} return pro ; }};class Factory{ public static Fruit getInstance(String className){ Fruit fruit = null ; try{ fruit = (Fruit)Class.forName(className).newInstance() ; }catch(Exception e){ e.printStackTrace() ; } return fruit ; }};public class FactoryDemo02{ public static void main(String args[]){ Properties pro = Init.getPro() ; Fruit f = Factory.getInstance(pro.getProperty("apple")) ; if(f!=null){ f.eat() ; } }};

6、獲取一個對象的方法package com.test.instancedemo.factorydemo ;import java.lang.reflect.Method ; // 導入構造方法的包import java.lang.reflect.Modifier ; // 導入構造方法的包public class GetMethodDemo{ public static void main(String args[]){ Class<?> c1 = null ; // 聲明Class對象 try{ c1 = Class.forName("com.test.instancedemo.factorydemo.Person") ; // 實例化對象 }catch(ClassNotFoundException e){ e.printStackTrace() ; } Method m[] = c1.getMethods() ; // 取得全部方法 for(int i=0;i<m.length;i++){ Class<?> r = m[i].getReturnType() ; // 得到返回值類型 Class<?> p[] = m[i].getParameterTypes() ; // 取得全部參數的類型 int xx = m[i].getModifiers() ; // 得到修飾符 System.out.print(Modifier.toString(xx) + " ") ; // 輸出修飾符 System.out.print(r + " ") ; System.out.print(m[i].getName()) ; System.out.print("(") ; for(int j=0;j<p.length;j++){ System.out.print(p[j].getName() + " " + "arg" + j) ; if(j<p.length-1){ System.out.print(",") ; } } Class<?> ex[] = m[i].getExceptionTypes() ; // 取出異常 if(ex.length>0){ System.out.print(") throws ") ; }else{ System.out.print(")") ; } for(int j=0;j<ex.length;j++){ System.out.print(ex[j].getName()) ; if(j<p.length-1){ System.out.print(",") ; } } System.out.println() ; } }};
