黑马程序员——java语言加强部分——反射之构造方法

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

概述

    反射就是把Java类中的各种成分映射成相应的java类。

    一个java类的组成部分:成员变量,方法,构造方法,包等等信息,这些信息也可以用一个个的java类来表示。总的来说就是:java类用Class类的实例对象表示,java类中的各种组成成分也用一个个相应类的实例对象来表示,例如:Field类来表示变量,Method类来表示方法,Constructor类来表示构造函数,Package类来表示包信息等。这些类的一个实例对象就表示一个信息,例如Method类的一个实例对象就表示一个方法,二个实例对象就表示两个方法。

 一、构造函数

    Constructor类,代表某个类的中的一个构造方法。它提供关于类的单个构造方法的信息以及对它的访问权限。

构造方法是没有顺序的,要想获取只能通过参数类型来判断获取。

    获取构造方法并初始化对象的步骤:

    1、  获得Constructor对象

     Class类中提供了几个获取该对象的方法:

    •   得到某个java类的所有的公共构造方法Constructor<?>[]     getConstructors()返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。注意,此方法返回 Constructor<T> 对象的数组(即取自此类构造方法的数组)时,此方法的返回类型是 Constructor<?>[],不是 预期的Constructor<T>[]。此少量信息的返回类型是必需的,因为从此方法返回之后,该数组可能被修改以保存不同类的 Constructor 对象,而这将违反 Constructor<T>[] 的类型保证。
    •   得到某个java类的某一个构造方法Constructor<T>        getConstructor(Class<?>...parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。要反映的构造方法是此 Class 对象所表示的类的公共构造方法,其形参类型与 parameterTypes 所指定的参数类型相匹配。
    •   得到某个java类的所有的指定的构造方法Constructor<T>        getDeclaredConstructor(Class<?>...parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
    •   得到某个java类的指定构造方法Constructor<?>[]     getDeclaredConstructors()返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

   注意:公共构造方法一般表示的是public类型的方法,而指定的构造方法一般是指不可见,被私有的构造方法。

 

   2、  获取实例对象

    即用构造方法来初始化对象。

    T  newInstance(Object... initargs)

    使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例

    注意:函数为空的构造函数还可以通过Class类中的静态方法newInstance()来获取,这个方法的好处是利用缓存机制来保存默认构造方法的实例对象

     下面以String类中的构造方法为例来介绍:

      代码一  

/*     构造函数String(Stringoriginal)
       初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。*/
    Constructor constructor=String.class.getConstructor(String.class);
    String str1=(String) constructor.newInstance("abdc");//“abdc”就是original字符串
    System.out.println("1==**"+str1.charAt(2));
     代码二
//空构造函数方式一
    String str3=String.class.newInstance();   
   //空构造函数方式二   
    Constructor tconstructor=String.class.getConstructor();
    String tstr3=(String) tconstructor.newInstance();
    代码三
//空构造函数方式一
    String str3=String.class.newInstance();   
   //空构造函数方式二   
    Constructor tconstructor=String.class.getConstructor();
    String tstr3=(String) tconstructor.newInstance();
    代码四
 /*构造函数String(char[] value, int offset, int count)
         分配一个新的 String,它包含取自字符数组参数一个子数组的字符。  */
    char[] ch={'a','b','d','c'};
    Constructorconstructor2=String.class.getConstructor(char[].class,Integer.TYPE,Integer.TYPE);
    String str4=(String) constructor2.newInstance(ch,0,3);
    System.out.println("2==**"+str4.charAt(2)+"*"+str4);

 

综上所述:我们在获取构造函数并用来初始化对象的时候,需要保证使方法getConstructor中的参数所表示的类型(字节码文件)与方法newInstance中的参数一致。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值