本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。

下面开始正文。

【案例1】通过一个对象获得完整的包名和类名

 

  1. package Reflect;  
  2.    
  3. /**  
  4.  * 通过一个对象获得完整的包名和类名  
  5.  * */  
  6. class Demo{  
  7.     //other codes...  
  8. }  
  9.    
  10. class hello{  
  11.     public static void main(String[] args) {  
  12.         Demo demo=new Demo();  
  13.         System.out.println(demo.getClass().getName());  
  14.     }  
  15. }  

【运行结果】:Reflect.Demo

添加一句:所有类的对象其实都是Class的实例。

【案例2】实例化Class类对象

  1. package Reflect; 
  2. class Demo{ 
  3.     //other codes... 
  4.   
  5. class hello{ 
  6.     public static void main(String[] args) { 
  7.         Class<?> demo1=null
  8.         Class<?> demo2=null
  9.         Class<?> demo3=null
  10.         try
  11.             //一般尽量采用这种形式 
  12.             demo1=Class.forName("Reflect.Demo"); 
  13.         }catch(Exception e){ 
  14.             e.printStackTrace(); 
  15.         } 
  16.         demo2=new Demo().getClass(); 
  17.         demo3=Demo.class
  18.           
  19.         System.out.println("类名称   "+demo1.getName()); 
  20.         System.out.println("类名称   "+demo2.getName()); 
  21.         System.out.println("类名称   "+demo3.getName()); 
  22.           
  23.     } 

【运行结果】:

类名称   Reflect.Demo

类名称   Reflect.Demo

类名称   Reflect.Demo

【案例3】通过Class实例化其他类的对象

通过无参构造实例化对象

  1. package Reflect; 
  2.   
  3. class Person{ 
  4.       
  5.     public String getName() { 
  6.         return name; 
  7.     } 
  8.     public void setName(String name) { 
  9.         this.name = name; 
  10.     } 
  11.     public int getAge() { 
  12.         return age; 
  13.     } 
  14.     public void setAge(int age) { 
  15.         this.age = age; 
  16.     } 
  17.     @Override 
  18.     public String toString(){ 
  19.         return "["+this.name+"  "+this.age+"]"
  20.     } 
  21.     private String name; 
  22.     private int age; 
  23.   
  24. class hello{ 
  25.     public static void main(String[] args) { 
  26.         Class<?> demo=null
  27.         try
  28.             demo=Class.forName("Reflect.Person"); 
  29.         }catch (Exception e) { 
  30.             e.printStackTrace(); 
  31.         } 
  32.         Person per=null
  33.         try { 
  34.             per=(Person)demo.newInstance(); 
  35.         } catch (InstantiationException e) { 
  36.             // TODO Auto-generated catch block 
  37.             e.printStackTrace(); 
  38.         } catch (IllegalAccessException e) { 
  39.             // TODO Auto-generated catch block 
  40.             e.printStackTrace(); 
  41.         } 
  42.         per.setName("Rollen"); 
  43.         per.setAge(20); 
  44.         System.out.println(per); 
  45.     } 

【运行结果】:

[Rollen  20]

但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后,会出现错误:

比如我定义了一个构造函数:

  1. public Person(String name, int age) { 
  2.         this.age=age; 
  3.         this.name=name; 
  4.     } 

然后继续运行上面的程序,会出现:

java.lang.InstantiationException: Reflect.Person

    at java.lang.Class.newInstance0(Class.java:340)

    at java.lang.Class.newInstance(Class.java:308)

    at Reflect.hello.main(hello.java:39)

Exception in thread "main" java.lang.NullPointerException

    at Reflect.hello.main(hello.java:47)

所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数

 

【案例】通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)

  1. package Reflect; 
  2.   
  3. import java.lang.reflect.Constructor; 
  4.   
  5. class Person{ 
  6.       
  7.     public Person() { 
  8.           
  9.     } 
  10.     public Person(String name){ 
  11.         this.name=name; 
  12.     } 
  13.     public Person(int age){ 
  14.         this.age=age; 
  15.     } 
  16.     public Person(String name, int age) { 
  17.         this.age=age; 
  18.         this.name=name; 
  19.     } 
  20.     public String getName() { 
  21.         return name; 
  22.     } 
  23.     public int getAge() { 
  24.         return age; 
  25.     } 
  26.     @Override 
  27.     public String toString(){ 
  28.         return "["+this.name+"  "+this.age+"]"
  29.     } 
  30.     private String name; 
  31.     private int age; 
  32.   
  33. class hello{ 
  34.     public static void main(String[] args) { 
  35.         Class<?> demo=null
  36.         try
  37.             demo=Class.forName("Reflect.Person"); 
  38.         }catch (Exception e) { 
  39.             e.printStackTrace(); 
  40.         } 
  41.         Person per1=null
  42.         Person per2=null
  43.         Person per3=null
  44.         Person per4=null
  45.         //取得全部的构造函数 
  46.         Constructor<?> cons[]=demo.getConstructors(); 
  47.         try
  48.             per1=(Person)cons[0].newInstance(); 
  49.             per2=(Person)cons[1].newInstance("Rollen"); 
  50.             per3=(Person)cons[2].newInstance(20); 
  51.             per4=(Person)cons[3].newInstance("Rollen",20); 
  52.         }catch(Exception e){ 
  53.             e.printStackTrace(); 
  54.         } 
  55.         System.out.println(per1); 
  56.         System.out.println(per2); 
  57.         System.out.println(per3); 
  58.         System.out.println(per4); 
  59.     } 

【运行结果】:

[null  0]

[Rollen  0]

[null  20]

[Rollen  20]

【案例】 

返回一个类实现的接口:

  1. package Reflect; 
  2.   
  3. interface China{ 
  4.     public static final String name="Rollen"
  5.     public static  int age=20
  6.     public void sayChina(); 
  7.     public void sayHello(String name, int age); 
  8.   
  9. class Person implements China{ 
  10.     public Person() { 
  11.           
  12.     } 
  13.     public Person(String sex){ 
  14.         this.sex=sex; 
  15.     } 
  16.     public String getSex() { 
  17.         return sex; 
  18.     } 
  19.     public void setSex(String sex) { 
  20.         this.sex = sex; 
  21.     } 
  22.     @Override 
  23.     public void sayChina(){ 
  24.         System.out.println("hello ,china"); 
  25.     } 
  26.     @Override 
  27.     public void sayHello(String name, int age){ 
  28.         System.out.println(name+"  "+age); 
  29.     } 
  30.     private String sex; 
  31.   
  32. class hello{ 
  33.     public static void main(String[] args) { 
  34.         Class<?> demo=null
  35.         try
  36.             demo=Class.forName("Reflect.Person"); 
  37.         }catch (Exception e) { 
  38.             e.printStackTrace(); 
  39.         } 
  40.         //保存所有的接口 
  41.         Class<?> intes[]=demo.getInterfaces(); 
  42.         for (int i = 0; i < intes.length; i++) { 
  43.             System.out.println("实现的接口   "+intes[i].getName()); 
  44.         } 
  45.     } 

【运行结果】:

实现的接口   Reflect.China

(注意,以下几个例子,都会用到这个例子的Person类,所以为节省篇幅,此处不再粘贴Person的代码部分,只粘贴主类hello的代码)

【案例】:取得其他类中的父类

 

  1. class hello{ 
  2.     public static void main(String[] args) { 
  3.         Class<?> demo=null
  4.         try
  5.             demo=Class.forName("Reflect.Person"); 
  6.         }catch (Exception e) { 
  7.             e.printStackTrace(); 
  8.         } 
  9.         //取得父类 
  10.         Class<?> temp=demo.getSuperclass(); 
  11.         System.out.println("继承的父类为:   "+temp.getName()); 
  12.     } 

【运行结果】

继承的父类为:   java.lang.Object