上一篇Java反射之Class类我们介绍了java反射的关键类Class,

反射就是由一个java类映射得到一个java类。

所以,我们自然能想到,一个类中应该有哪些属性,这里做个比方,人有名字年龄等属性,所有一个Person类中就会有name,age这两个属性,同理,一个类中也有构造方法,字段,方法等属性。

接下来我们首先了解构造方法,通过反射构造方法动态创建一个对象。

[一] Constructor类

Constructor对象代表的是一个构造方法,那么这个对象应该有哪些方法呢,我们猜测一定会有获得这个构造方法的名称,获得该构造方法属于的类,通过这个构造方法产生一个对象等方法。

从jdk文档里可以看到有getName()获得构造方法名称,getDeclaringClass()获得所属类的类,newInstance()创建对象。

在开发中,我们常用Constructor类的newInstance()方法来动态创建对象。

[二] 获得Constructor对象

在演示Constructor类中的方法前,先介绍如何获得Constructor,和Class一样,Constructor也不可以直接new出。

上面是Class类的jdk文档中的两个方法,这两个方法分别是获得指定的构造方法和获得所有的构造方法。

所以我们知道,想要得到Constructor对象,就要先获得Class对象。下面我们来演示以下

[三] 演示

我们依旧拿String这个类做演示。

从上图可以看出,String类中有很多的构造方法。

栗子演示

1.获得所有的构造方法

public static void main(String[] args) throws Exception {

Class cls = Class.forName("java.lang.String");

//获取所有构造方法

Constructor[] constructor = cls.getConstructors();

for(Constructor cons : constructor){

System.out.println(cons);

}

}

结果:

public java.lang.String(byte[],int)

public java.lang.String(byte[],int,int,java.nio.charset.Charset)

public java.lang.String(java.lang.StringBuffer)

public java.lang.String(byte[])

public java.lang.String(byte[],int,int)

public java.lang.String(byte[],java.nio.charset.Charset)

public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException

public java.lang.String()

public java.lang.String(java.lang.StringBuilder)

public java.lang.String(byte[],int,int,int)

public java.lang.String(int[],int,int)

public java.lang.String(char[],int,int)

public java.lang.String(char[])

public java.lang.String(java.lang.String)

public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException

从输出的情况可以猜测,Constructor类一定有方法,可以获得构造方法前的修饰符,参数,抛出的异常等等.

2.获得单个构造方法

public static void main(String[] args) throws Exception {

Class cls = Class.forName("java.lang.String");

//获取单个构造方法

Constructor constructor = cls.getConstructor(StringBuffer.class);

String constructorName = constructor.getName();

System.out.println(constructorName);

}

结果:

java.lang.String

就像java的重载方法一样,判断方法重载的依据是参数个数的不同和参数类型的不同,所以获得特定构造方法也是根据参数的类型,参数的个数来得到对应的构造方法。

将原方法参数的class类型作为getConstructor方法的参数传入,获得对应参数的构造方法。同理获得其他构造方法也是相同的。

3.通过构造方法创建对象

public static void main(String[] args) throws Exception {

Class cls = Class.forName("java.lang.String");

//获取单个构造方法

Constructor constructor = cls.getConstructor(StringBuffer.class);

//由于在编译时,无法检测到是什么类型的Constructor所以需要进行类型强转

String str = (String)constructor.newInstance(new StringBuffer("abc"));

//拿到反射出来的对象,调用charAt方法测试

System.out.println(str.charAt(2));

}

结果:

c

这里有些朋友可能会出现这样的错误:

public static void main(String[] args) throws Exception {

Class cls = Class.forName("java.lang.String");

//获取单个构造方法

Constructor constructor = cls.getConstructor(StringBuffer.class);

//由于在编译时,无法检测到是什么类型的Constructor所以需要进行类型强转

String str = (String)constructor.newInstance("abc");

//拿到反射出来的对象,调用charAt方法测试

System.out.println(str.charAt(2));

}

结果:

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

at club.leyvan.muzile.ConstructDemo.main(ConstructDemo.java:12)

类型不批配错误,这就是说,上面代码中的constructor对应的是参数是StringBuffer的这个构造方法,而传进去的参数不是StringBuffer对象,所以会报错。

小结: 获得方法时要用到类型class,调用方法时要用到上面相同类型的实例对象。

[四] Class中的newInstance()方法

在Class类中也有newInstance方法,查看Class类源码就可以知道,该方法调用的时默认的无参构造方法来创建对象,采用缓存机制,将无参的构造方法缓存起来,当调用newInstance方法时,从缓存中取出无参构造方法创建对象。

和Constructor中的区别在于,Class中的newInstance方法调用的是无参构造,不能调用有参构造。

java 反射 构造方法_Java反射之构造方法反射相关推荐

  1. js java 反射机制_java 类加载机制和反射机制

    一.类的加载机制 jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程. (1)加载 将class文件字节码内容加载到内存中,并将这些静态数 ...

  2. 反射 字段_java核心基础之反射

    前言 大家好,我是 jack xu,今天跟大家介绍核心基础里面的反射,反射这个东西你说它重要也重要,不重要也不重要.重要是当你看一些框架的源码时候,里面会用到反射的代码,你不会是看不懂的.不重要是因为 ...

  3. java抽象类构造方法_Java 抽象类中构造方法的作用?如何理解?

    java抽象类的构造方法和普通类的构造方法一样 都是用来初始化类 只是抽象类的构造方法不能直接调用 因为抽象类不能实现实例 但是一旦一个普通类继承了抽象类 便也可以在构造函数中调用其抽象类的构造函数 ...

  4. java怎么调用构造方法_java怎么调用构造方法

    Java调用构造方法,那就是子类调用基类(父类)的构造方法,如何调用,请看详细内容. 子类中的构造方法的规则 子类的构造过程中必须调用其基类的构造方法. 子类可以在自己的构造方法中使用super(ar ...

  5. java的无参构造方法_Java有参构造方法和无参构造方法

    1.定义: 编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法:(如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效) 编写时添加了有参构造方法而未添加无参构造方法,那么 ...

  6. java类构造_Java中类的构造方法

    constructor:构造函数. 在创建对象的时候,对象成员可以由构造函数方法进行初始化. new对象时,都是用构造方法进行实例化的: 例如:Test test = new Test("a ...

  7. java 反射基础_Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射.反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的 ...

  8. java 反射.问题_Java知识点总结(反射-反射机制性能问题)

    Java知识点总结(反射-反射机制性能问题) @(Java知识点总结)[Java, 反射] 性能相关注意点: setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象 ...

  9. java构造器构造方法_Java构造器(构造方法/constructor)

    我们先来看一下什么是构造器: 1.构造器也叫构造方法或构造函数,分为有参构造器和无参构造器: 2.构造器也是一种方法,只不过是一种特殊的方法,它会在对象创建的时候被调用: 3.构造器最大的作用就是在创 ...

  10. java 生成构造方法_Java中的构造方法

    Java中的构造方法(构造器) 定义 一个在创建对象时自动被调用的特殊方法 作用 为对象进行初始化(成员变量)工作,即初始化类对象的属性,而构造对象是通过new关键字 特征 构造器是一种特殊的方法 构 ...

最新文章

  1. Elsevier的Greg Landrum访谈 | 成功的开源化学信息软(RDKit)的要素是什么?
  2. 16张图带你学会 Ansible 自动化运维工具
  3. 【CyberSecurityLearning 46】PHP 函数
  4. [PAT乙级]1013 数素数
  5. vb 数组属性_VB中菜单编辑器的使用讲解及实际应用
  6. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
  7. 《BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding》
  8. 封装Python列表实现多下标访问
  9. jQuery中的bind() .live() .delegate()的区别
  10. Linux 目录结构及主要内容 2
  11. SpringBoot下实现PDF转word(Maven项目)
  12. C#.NET彩票数据分析
  13. LANP+KEEPALIVED集群(一)
  14. [置顶] [VS2010]逸雨清风 永久稳定音乐外链生成软件V0.1
  15. OpenCV-Python 直方图-4:直方图反投影 | 二十九
  16. 知识图谱构建——Jena推理(三)
  17. 23 种设计模式详解(全23种)
  18. 写一个用矩形法求定积分的通用函数,分别求: ∫(0,1) sinxdx , ∫(0,1)cosxdx , ∫(0,1)e^xdx 。
  19. 超七成阅读APP都借百度语音技术促用户增长
  20. 一道有趣的啤酒趣味题

热门文章

  1. 控件安全注册方法3选
  2. 7月送书中奖名单,快看!
  3. requestmapping配置页面后_SpringBoot2.0 基础案例(03):配置系统全局异常映射处理
  4. 什么是安斯库姆四重奏?为什么统计分析之前必须要作图?
  5. BIC/ImageGP稳定性问题
  6. 挖掘PubMed数据库,获取报道的或推测新的基因调控关系
  7. Mac免费软件推荐:Wireshark for Mac(网络分析器)
  8. java 创建文件夹_VS Code用来开发JAVA项目真香
  9. IM即时通讯结合mui 环信
  10. matlab fftshift_MATLAB信号频谱分析FFT详解