利用反射机制创建新类的两种方式及比较

【0】README

0.1) 本文描述+源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射机制创建类实例;
0.2) 转载的源代码,参见 https://github.com/pacosonTang/core-java-volume/tree/master/chapter5/reflectionCreateInstance


【1】通过反射创建新的类示例,有两种方式:

2.1)第一种方式: Class.newInstance()
2.2)第二种方式: Constructor.newInstance()


【2】以下对两种调用方式给以比较说明:

2.1)调用的构造函数有无参数: Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;而Constructor.newInstance() 可以根据传入的参数,调用任意构造函数(包括有参+无参);
2.2)是否抛出异常: Class.newInstance() 抛出所有由被调用构造函数抛出的异常;
2.3)调用的构造函数的可见性: Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;而 Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数(private);


【3】看个荔枝

3.1)A.java

package com.corejava.chapter5;public class A
{private A(){System.out.println("A's constructor is called.");}private A(int a, int b){System.out.println("a:" + a + " b:" + b);}
}

3.2)B.java

package com.corejava.chapter5;
import java.lang.reflect.Constructor;
import static java.lang.System.out;public class B
{public static void main(String[] args){B b; b = new B();out.println("通过Class.NewInstance()调用私有构造函数:");b.newInstanceByClassNewInstance();out.println("通过Constructor.newInstance()调用私有构造函数:");b.newInstanceByConstructorNewInstance();}/* 通过Class.NewInstance()创建新的类示例 */private void newInstanceByClassNewInstance(){try{/* 当前包名为reflect,必须使用全路径 */A a = (A) Class.forName("com.corejava.chapter5.A").newInstance();} catch (Exception e){out.println("通过Class.NewInstance()调用私有构造函数【失败】");}}/* 通过Constructor.newInstance()创建新的类示例 */private void newInstanceByConstructorNewInstance(){try{/* 可以使用相对路径,同一个包中可以不用带包路径 */Class c = Class.forName("com.corejava.chapter5.A");/* 以下调用无参的、私有构造函数 */Constructor c0 = c.getDeclaredConstructor();c0.setAccessible(true);A a0 = (A) c0.newInstance();/* 以下调用带参的、私有构造函数 */Constructor c1 = c.getDeclaredConstructor(new Class[] { int.class,int.class });c1.setAccessible(true);A a1 = (A) c1.newInstance(new Object[] { 5, 6 });} catch (Exception e){e.printStackTrace();}}
}

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)

如何设计高效测试用例在本系列的第一部分中,我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中,我们将仔细研究代码级单元测试和组件或用例测试。 单元测试 单元测试验证单个单元(通常是类)的行为&#xff0c…

php mysql study_PHPstudy升级mysql数据库

首先查看phpstudy的mysql版本:方法一 使用mysql的version函数:mysql> selectversion();方法二 status命令mysql> status;方法三 直接在cmd下输入命令查看mysql -vmysql --help下面开始升级数据库1、备份好自己的数据库2、清空phpstudy…

selenium 等待_Selenium等待:内隐,外显,流利和睡眠

selenium 等待Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落,更可靠。 Selenium提供多次等待,以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教…

java接口概述

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 java 接口概念 ; 0.2)接口技术: 这种技术主要用来描述类具有什么功能, 并不给出每个功能的具体实现; 一个类可以实现多…

通过aws部署推荐系统_通过AWS Elastic Beanstalk轻松进行Spring Boot部署

通过aws部署推荐系统朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认…

图论算法基础

【0】README 0.1)本文总结于 数据结构与算法分析, 旨在复习数据结构中图论算法的基础知识; 【1】图论若干相关定义 1.1)图G定义:一个图G(V,E)由顶点及集V 和 边集E组成&#xff0c…

mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决

问题:直接拷贝data下的数据库数据进行备份,重装升级了数据库,直接复制备份数据到新的数据库data目录下,发现部分数据表不见了。原因分析:以表“Table”为例:如类型是MyISAM, 数据文件则以”Table.frm”,”T…

aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

aws 删除ec2实例你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序。 这是我们将要执行的步骤。 1.使用Spring Boot Initialiser创建一个Spring Boot项目。 2.创建一个休息端点,部署后我们可以访问 3.启动EC2…

jdbc操作mysql数据库_JDBC操作MySQL数据库(一)

连接MySQL数据库连接数据源有两种方式:1)通过DriverManager类2)通过DataSource接口及JNDI资源获得连接DriverManager类的路径为java.sql.DriverManager,它主要完成驱动程序的装载和建立新的数据库连接。其常用方法如下:* getConnection (Stri…

只读事务上下文_我可以/应该在事务上下文中使用并行流吗?

只读事务上下文介绍 长话短说,您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称,因此它确实参与了事务。 Streams API旨在在某些准则下正常工作。 实际上,为了受益于并行性,不允许每个操作更改共享对象的…

mysql多表查询详解_MySQL多表查询详解上

时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你,既然点了进来&#xff…

无权最短路径

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 无权最短路径 的思想并用源代码加以实现; 【1】无权最短路径相关概念(边的权值赋值为1) 1.1)概述:下…

java 键入_在Java中键入Safe SQL

java 键入字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,总会最终将SQL语句声明为Java String。 这种方法的问题在于,您必须为每个语句编写测试,以确保它甚至是有效SQ…

filter过滤后重新添加_Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

前言在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在 Spring Boot 中有两种方式:使用 Servlet 3.0 API 的注解 WebServlet、WebFilter、Listener 用来配置。Spring Boot JavaConfig…

对象克隆+深浅拷贝

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 对象拷贝 的概念 , 特别是对 深拷贝和浅拷贝 的理解; 0.2) 最后,我们还要看一个 clone 的荔枝; 【1】对象克隆相关 1…

read cache_通过READ-BEHIND CACHE控制您的慢速生产者

read cache在我们的互联世界中,我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利,他们的表现就会很好,每个人都会高兴。 但是太多次,我们不得不使用延迟小于最佳延迟的 API。 当然,答案是缓存该数据 。…

azkaban mysql参数_azkaban参数详解

参数传递是调度字体工作流运行时非常重要的一部分,工作流的执行,单个作业的执行,多个工作流之间的依赖执行,历史任务重算,都涉及到参数传递和同步。1 参数类型综述azkaban的工作流中的参数可以分为如下几个类型&#x…

接口与回调

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 接口与回调 概念 ; 【1】接口与回调相关 1.1)回调定义: 回调是一种常见的程序设计模式, 在这种模式中, 可以指出某个…

spring react_使用Spring Cloud Gateway保护React式微服务

spring react朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护。 所以你想完全React,是吗? 大! React式编程是使…

mysql断电同步不起作用_mysql主从同步因断电产生的不能同步问题

偶尔因为断电导致mysql slave 出现复制错误“Could not parse relay log event entry”Could not parse relay log event entry. The possible reasons are: the masters binary log is corrupted (you can check this by running mysqlbinlog on the binary log), the slaves …