A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sxsxsx 中级黑马   /  2015-5-15 17:06  /  497 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

  26. import java.lang.reflect.*;
  27. class hello{
  28.     public static void main(String[] args) {
  29.         int[] temp={1,2,3,4,5};
  30.         Class<?>demo=temp.getClass().getComponentType();
  31.         System.out.println("数组类型: "+demo.getName());
  32.         System.out.println("数组长度  "+Array.getLength(temp));
  33.         System.out.println("数组的第一个元素: "+Array.get(temp, 0));
  34.         Array.set(temp, 0, 100);
  35.         System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));
  36.     }
  37. }
复制代码

【案例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.   
  25. class hello{
  26.     public static void main(String[] args) {
  27.         Class<?> demo=null;
  28.         try{
  29.             demo=Class.forName("Reflect.Person");
  30.         }catch (Exception e) {
  31.             e.printStackTrace();
  32.         }
  33.         Person per=null;
  34.         try {
  35.             per=(Person)demo.newInstance();
  36.         } catch (InstantiationException e) {
  37.             // TODO Auto-generated catch block
  38.             e.printStackTrace();
  39.         } catch (IllegalAccessException e) {
  40.             // TODO Auto-generated catch block
  41.             e.printStackTrace();
  42.         }
  43.         per.setName("Rollen");
  44.         per.setAge(20);
  45.         System.out.println(per);
  46.     }
  47. }
复制代码



【运行结果】:

[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.   
  34. class hello{
  35.     public static void main(String[] args) {
  36.         Class<?> demo=null;
  37.         try{
  38.             demo=Class.forName("Reflect.Person");
  39.         }catch (Exception e) {
  40.             e.printStackTrace();
  41.         }
  42.         Person per1=null;
  43.         Person per2=null;
  44.         Person per3=null;
  45.         Person per4=null;
  46.         //取得全部的构造函数
  47.         Constructor<?> cons[]=demo.getConstructors();
  48.         try{
  49.             per1=(Person)cons[0].newInstance();
  50.             per2=(Person)cons[1].newInstance("Rollen");
  51.             per3=(Person)cons[2].newInstance(20);
  52.             per4=(Person)cons[3].newInstance("Rollen",20);
  53.         }catch(Exception e){
  54.             e.printStackTrace();
  55.         }
  56.         System.out.println(per1);
  57.         System.out.println(per2);
  58.         System.out.println(per3);
  59.         System.out.println(per4);
  60.     }
  61. }
复制代码



【运行结果】:

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




【运行结果】:

实现的接口   Reflect.China






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马