天天看点

Java反射 - 通过反射创建有参与无参构造函数的对象

一、问题分析

反射机制 : 指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

反射可以创建类的对象.

​newInstance()方法​

​​可以创建类的实例.那么拥有该方法除了​

​Class类​

​​之外,还有​

​Constructor类​

​.

可是,Class类中的newInstance()方法只能创建默认构造器的对象,想要创建有参的构造函数还是要使用Constructor类中的newInstance(Object … initargs)方法.

那么如何获取Class类对象呢?如何获取Constructor类对象呢?

二、获取Class类对象

获取该类对象的方式有三种.对象.
  1. 对象.getClass()
  2. Class.forName(全限定类名);
  3. 类名.class
  • 获取数组的Class类对象.

    int[].class 或者 Class.forName("[I");

    String数组获取方式还可以`Class.forName("[Ljava.lang.String;");

1.getClass()方法是Object类中的方法,Object类是所有类的父类,所有创建的对象都有该方法.

2.只要获取了类的全限定名,就可以通过​

​Class.forName(String)​

​的形式来获取Class对象

3.​

​类型.class​

​是一个Class类型的对象.且类型不一定是类,例如,int.

获取了Class类对象后,就可以直接调用​

​newInstance()方法​

​来创建该类的对象.

Note : Class类中的newInstance()方法只能创建无参构造函数的对象.

三、获取Constructor类对象

先获取Class类对象后,可以调用​

​getConstructor(Class<?>... parameterTypes)方法​

​​和​

​getDeclaredConstructor(Class<?>... parameterTypes)方法​

这两个方法的区别是什么呢?​​getDeclaredConstructor()与getConstructor的区别​​

首先看getDeclaredConstructor(Class<?>… parameterTypes)

这个方法会返回指定参数类或接口的构造器,​​

​包括public的和非public的,当然也包括private的。​

​​ getDeclaredConstructors()的返回结果就没有参数类型的过滤了,返回类声明的所有构造函数的 Constructor对象的数组。

再来看getConstructor(Class<?>… parameterTypes)

这个方法返回的是上面那个方法返回结果的子集,​

​只返回指定参数类型访问权限是public的构造器。​

​ getConstructors()的返回结果同样也没有参数类型的过滤。返回类的所有公共构造函数。

知道两个方法的区别之后,就可以根据构造器的修饰符匹配调用哪个方法.(如果创建有参构造函数的对象时,需要在调用方法的参数依照构造器的类型顺序写上​

​类型.class​

​)

调用该方法,将会返回​

​Constructor类对象​

​​,那么就可以调用​

​newInstance(Object ... initargs)方法​

​,参数传入想要传入对应构造器相应类型的参数即可.创建完成.

四、实例演示

  1. ​​Java反射 - [实例演示] 创建类的对象多种方式​​
  2. ​​Java反射 - 创建数组实例​​

五、可能出现的问题

继续阅读