1. 程式人生 > >java反射例項詳解

java反射例項詳解

本文先講java反射的示例程式碼,希望看了程式碼以及分析對你有所幫助。 
【案例1】通過一個物件獲得完整的包名和類名



package org.shen.own; 

import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Hashtable; 

public class Hash { 
... 


package org.shen.own; 
public class Reflect { 
public static void main(String[] args) { 

Hash hash = new Hash(); 
System.out.println(hash.getClass().getName()); 



程式執行結果:org.shen.own.Hash 
補充一句:所有類的物件其實都是Class的例項。 

【案例2】例項化Class類物件


Hash程式碼  收藏程式碼
  1. package org.shen.own;  
  2. public class Reflect {  
  3.     public static void main(String[] args) {  
  4.         Class<?> hash1 = null;  
  5.         Class<?> hash2 = null;  
  6.         Class<?> hash3 = null;  
  7.         try {  
  8.             hash1 = Class.forName("org.shen.own.Hash");  //返回與帶有給定字串名的類或介面相關聯的 Class 物件  
  9.         } catch (ClassNotFoundException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.         hash2 = new Hash().getClass();  
  13.         hash3 = Hash.class;  
  14.         System.out.println(hash1.getName());  
  15.         System.out.println(hash2.getName());  
  16.         System.out.println(hash3.getName());  
  17.     }  
  18. }  


執行結果: 
org.shen.own.Hash 
org.shen.own.Hash 
org.shen.own.Hash 

【案例3】通過Class例項化其他類的物件


Person程式碼  收藏程式碼
  1. package org.shen.own;  
  2. public class Person {  
  3.     private int age;  
  4.     private String name;  
  5.     public int getAge() {  
  6.         return age;  
  7.     }  
  8.     public void setAge(int age) {  
  9.         this.age = age;  
  10.     }  
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     @Override  
  18.     public String toString() {  
  19.         return "Person [age=" + age + ", name=" + name + "]";  
  20.     }  
  21. }  


Reflect程式碼  收藏程式碼
  1. package org.shen.own;  
  2. public class Reflect {  
  3.     public static void main(String[] args) {  
  4.     Class<?> demo = null;  
  5.     try {  
  6.         demo = Class.forName("org.shen.own.Person");  
  7.     } catch (ClassNotFoundException e) {  
  8.         e.printStackTrace();  
  9.     }  
  10.     Person person = null;  
  11.     try {  
  12.         person = (Person)demo.newInstance();//這裡不例項化  會報空指標異常  
  13.     } catch (InstantiationException e) {  
  14.         e.printStackTrace();  
  15.     } catch (IllegalAccessException e) {  
  16.         e.printStackTrace();  
  17.     }  
  18.     person.setAge(20);  
  19.     person.setName("shen");  
  20.     System.out.println(person);  
  21.     }  
  22. }  


輸出結果:Person [age=20, name=shen] 

但是注意一下,當我們把Person中的預設的無參建構函式取消的時候,比如自己定義只定義一個有引數的建構函式之後,會出現錯誤: 
Person建構函式程式碼  收藏程式碼
  1. public Person(int age, String name) {  
  2.     super();  
  3.     this.age = age;  
  4.     this.name = name;  
  5. }  


如下錯誤: 

錯誤程式碼  收藏程式碼
  1. java.lang.InstantiationException: org.shen.own.Person  
  2.     at java.lang.Class.newInstance0(Class.java:340)  
  3.     at java.lang.Class.newInstance(Class.java:308)  
  4.     at org.shen.own.Reflect.main(Reflect.java:13)  
  5. Exception in thread "main" java.lang.NullPointerException  
  6.     at org.shen.own.Reflect.main(Reflect.java:19)  


所以大家以後再編寫使用Class例項化其他類的物件的時候,一定要自己定義無參的建構函式 
【案例】通過Class呼叫其他類中的建構函式 (也可以通過這種方式通過Class建立其他類的物件)


示例程式碼  收藏程式碼
  1. package org.shen.own;  
  2. import java.lang.reflect.Constructor;  
  3. import java.lang.reflect.InvocationTargetException;  
  4. public class Reflect {  
  5.     public static void main(String[] args) {  
  6.         Class<?> demo = null;  
  7.         try {  
  8.             demo = Class.forName("org.shen.own.Person");  
  9.         } catch (ClassNotFoundException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.         Person per1 = null;  
  13.         Person per2 = null;  
  14.         Person per3 = null;  
  15.         Person per4 = null;  
  16.         Constructor<?>[] cons = demo.getConstructors();//獲取實體類的建構函式  共有四個  
  17.         int i;  
  18.         for(i=0;i<cons.length;i++){  
  19.             System.out.println(cons[i]);  
  20.         }  
  21.         try {  
  22.             per1 = (Person) cons[0].newInstance(20);  
  23.             per2 = (Person) cons[1].newInstance();  
  24.             per3 = (Person) cons[2].newInstance("shenyc");  
  25.             per4 = (Person) cons[3].newInstance(20,"shenyc");  
  26.         } catch (InstantiationException e) {  
  27.             e.printStackTrace();  
  28.         } catch (IllegalAccessException e) {  
  29.             e.printStackTrace();  
  30.         } catch (IllegalArgumentException e) {  
  31.             e.printStackTrace();  
  32.         } catch (InvocationTargetException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         System.out.println(per1);  
  36.         System.out.println(per2);  
  37.         System.out.println(per3);  
  38.         System.out.println(per4);  
  39.     }  
  40. }  


執行結果: 
public org.shen.own.Person(int) 
public org.shen.own.Person() 
public org.shen.own.Person(java.lang.String) 
public org.shen.own.Person(int,java.lang.String) 
Person [age=20, name=null] 
Person [age=0, name=null] 
Person [age=0, name=shenyc] 
Person [age=20, name=shenyc] 
『案例』返回一個類實現的介面:


介面示例程式碼  收藏程式碼
  1. package org.shen.own;  
  2. public class Person1 implements China{  
  3.     public Person1(){}  
  4.     public Person1(String sex){  
  5.         this.sex = sex;  
  6.     }  
  7.     @Override  
  8.     public void sayChina() {  
  9.         System.out.println("say ,hello , china!");  
  10.     }  
  11.     @Override  
  12.     public void sayHello(String name, int age) {  
  13.         System.out.println(name + "   ---  " + age);  
  14.     }  
  15.     private String sex;  
  16.     public String getSex() {  
  17.         return sex;  
  18.     }  
  19.     public void setSex(String sex) {  
  20.         this.sex = sex;  
  21.     }  
  22. }  
  23. package org.shen.own;  
  24. public interface China {  
  25.     public static final String name = "Shenyc";  
  26.     public static int age = 20;  
  27.     public void sayChina();  
  28.     public void sayHello(String name,int age);  
  29. }  
  30. package org.shen.own;  
  31. public class Reflect {  
  32.     public static void main(String[] args) {  
  33.     Class<?> cls = null;  
  34.     try {  
  35.         cls = Class.forName("org.shen.own.Person1");  //拿到Person1  
  36.     }