当前位置:首页 > Java技术 > Java反射 - 通过反射创建有参与无参构造函数的对象

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

2022年09月16日 22:59:13Java技术8

一、问题分析

反射机制 : 指的是程序在运行时能够获取自身的信息。在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)方法,参数传入想要传入对应构造器相应类型的参数即可.创建完成.

对于getDeclaredConstructor(Class<?> ... parameterTypes)方法可以访问私有构造器,因此对于私有构造器,仍然可以创建对象.但是在调用newInstance(Object ... initargs)方法时,需要先将反射对象的accessible标志设置为true.

四、实例演示

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

五、可能出现的问题

[报错信息] : java.lang.NoSuchMethodException: java.lang.Integer.< init >() - Java反射创建对象出现

作者:ClearlightY
来源链接:https://blog.csdn.net/qq_36852780/article/details/100013212

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42350.html

分享给朋友:

“Java反射 - 通过反射创建有参与无参构造函数的对象” 的相关文章

Java反射笔记

Java反射笔记

Java反射笔记 1:Class类 同Object,String等类一样,Class也是一个类 构造函数只可由JVM调用,不可由开发者调用。 任何一个类均是Class类的实例对象。 任何继承Object的对象均有 g...

Java 反射之Class介绍和三种创建方式

反射的好处(为什么需要反射机制): 通过反射机制可以获取到一个类的完整信息,例如:所有(包含private修饰)属性和方法,包信息等。 换句话说,Class本身表示一个类的本身,通过Class可以完整获取一个类中的完整结构,包含此...

Java反射机制及用途

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; class.forName(类名)//获得类      这种动态获取的信息以及...

Java反射获取字段、设置字段以及获取字段的值

Java反射获取字段、设置字段以及获取字段的值 获取字段 1.先找到字段所在类的字节码 2.找到需要被获取的字段 Class类中获取字段: public Field[] getFields();//获取包括自身和继承(实现)过来的所有的public字...

java反射遍历实体的所有属性名称和值

import java.lang.reflect.Field; import java.lang.reflect.Method; // model换成需要遍历的实体 // 获取实体类的所有属性,返回Field数组...

使用JOOR实现Java反射

我的博客原文地址 在前面的博客 Java反射使用 列举了Java反射的一些使用,下面介绍开源反射工具JOOR的使用。 只需几行代码就实现了前面博客中内部类的反射: public void testJoor(){ Ref...

java反射的使用场合和作用、及其优缺点

1)使用场合 在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息。 2)主要作用 通过反射可以使程序代码访问装载到JVM 中的类的内部信息,获取已装载类的属性信息,获取已装载类的方法,获取已装载类的构造方法信息 3)反射...

java反射中getDeclaredMethods和getMethods的区别

java反射中getDeclaredMethods和getMethods的区别

getMethods()            返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些...

【Java基础】RTTI与反射之Java

【Java基础】RTTI与反射之Java

一、引言    很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象。在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假定我们在编译时已经知道了所有类型。2.反射机制,运行我们在运行时发现和使用...

JAVA反射(高新技术)

JAVA反射 一、知识准备 现在我们首先来看三个问题。 1.什么是Class 类 类描述:描述JAVA类,众多的人可以用person类来表示,众多的JAVA类可以用一个类来描述,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。