Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463
上一章节已经说过,一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。
- 公有属性class
- 方法getClass()
- Class.forName()
下面是示例代码:
/**
* <p>Title: Java获取Class对象的三种方式</p>
*/
public class ReflectClassDemo {
/** log4j */
private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);
/**
* <p>获取Class对象的三种方式</p>
*/
public static void main(String[] args) throws ClassNotFoundException {
LOGGER.info("获取Class对象方式01:类的public属性class");
Class clazz1 = User.class;
LOGGER.info(clazz1); System.out.println();
LOGGER.info("获取Class对象方式02:类的public方法getClass()");
User user = new User();
Class clazz2 = user.getClass();
LOGGER.info(clazz2); System.out.println();
LOGGER.info("获取Class对象方法03:Class.forName(需要抛出异常)");
Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");
LOGGER.info(clazz3);
}
}
运行结果:
ReflectClassDemo:18 - 获取Class对象方式01:类的public属性class
ReflectClassDemo:20 - class pers.hanchao.reflect.common.User ReflectClassDemo:23 - 获取Class对象方式02:类的public方法getClass()
ReflectClassDemo:26 - class pers.hanchao.reflect.common.User ReflectClassDemo:29 - 获取Class对象方法03:Class.forName(需要抛出异常)
ReflectClassDemo:31 - class pers.hanchao.reflect.common.User
2.通过反射实例化对象的两种方式
除了通过new实例化对象,我们还可以通过反射实例化对象对象,有两种方式:
- Class.newInstance()
- Constructor.newInstance()
下面是示例代码:
/**
* 通过反射创建对象的两种方式
*/
public class CreateObjectDemo {
private final static Logger LOGGER = Logger.getLogger(CreateObjectDemo.class); /**
* <p>Title: 通过反射创建对象的两种方式</p>
*/
public static void main(String[] args) throws Exception {
//通过new实例化对象
User user = new User();
LOGGER.info("通过new实例化对象:" + user.toString()); //通过反射实例化对象
Class userClass = User.class;
//通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造])
User user1 = (User) userClass.newInstance();
LOGGER.info("通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):" + user1.toString());
//通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[可带参数])
Constructor constructor = userClass.getDeclaredConstructor();
User user2 = (User) constructor.newInstance();
LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):" + user2.toString());
Constructor constructor1 = userClass.getDeclaredConstructor(String.class,String.class);
User user3 = (User) constructor1.newInstance("李四","000000");
LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):" + user3.toString());
}
}
运行结果:
INFO CreateObjectDemo:22 - 通过new实例化对象:User{username='张三', password='123456'}
INFO CreateObjectDemo:27 - 通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
INFO CreateObjectDemo:31 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
INFO CreateObjectDemo:34 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):User{username='李四', password='000000'}
总结:
- 通过Class.newInstance()进行对象实例化:实际调用的是无参数的构造函数进行实例化。
- 通过Constructor.newInstance()进行对象实例化:可以选择调用哪个构造函数进行实例化。
Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式的更多相关文章
- java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?
String类型是实际工作中经经常使用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象能够用new创建,比如String name=new S ...
- Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用
当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...
- C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>
c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...
- Java常见重构技巧 - 去除不必要的!=null判断空的5种方式,很少有人知道后两种
常见重构技巧 - 去除不必要的!= 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?@pdai 常见重构技巧 - 去除不必要的!= 场景一:null无意义之常规判断空 ...
- 获取select文本框的下拉菜单文字内容的两种方式
<body> <div class="box"> <select id="sel"> <option value=&q ...
- 获取表单选中的值(利用php和js两种方式)
php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...
随机推荐
- FCC---CSS Flexbox: Apply the flex-direction Property to Create a Column in the Tweet Embed
The tweet embed header and footer used the flex-direction property earlier with a row value. Similar ...
- UiPath Read CSV 中文乱码
问题:UiPath 读取.CSV文件时,出现中文乱码. 解决1: 修改CSV文件的编码为UTF-8 解决2: 设置Read CSV Activity的 encoding属性为csv相应的编码格式 参考 ...
- 使用git将本地java项目上传到GitHub
使用git将项目上传到github(最简单方法) 声明:本人是根据上文给的链接的方式,上传到github上的,亲测有效. 首先你需要一个github账号,所有还没有的话先去注册吧! https://g ...
- webpack动态加载打包chunk命名
最近,遇到复杂h5页面开发,为了优化H5首屏加载速度,想到使用按需加载的方式,减少首次加载的JavaScript文件体积,于是将处理过程在这里记录一下,涉及到的主要是以下三点: 使用Webpack如何 ...
- EggJS接口开发
需求 随着Nodejs的普及,前端开发的开发场景基本可以贯穿界面交互到数据存储,无缝实现全栈开发.最近在实现一个内部项目管理工具的时候,就尝试了一把接口和数据库开发. 什么是Egg.js Egg.js ...
- tl-wr742n 怎么设置dns
打开无线路由器,用笔记本设置,点击无线网络,点击连接需要设置的无线路由 在弹出的菜单点击[是] 在无线路由器有的背面有个标签,上面PIN码,输入PIN码 打开IE浏览器在地址栏输入192.168 ...
- 使用系统定时器SysTick实现精确延时微秒和毫秒函数
SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...
- Java8新特性之接口defualt,static方法
简介 作用 Java8中接口引入了defualt,static两种方法提供默认实现,彻底打破了接口不能有默认实现的规定 static 让接口类似于工具类,提供一些静态方法 static方法不会被子类继 ...
- android上如何写配置文件
android上如何写配置文件:使用SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态 ...
- 2.Python 赋值与内存
定义变量和赋值其实就是系统处理内存的过程和问题,这篇文章分别从申请和释放内存两部分讨论 一.申请内存 python定义一个变量时,会为变量的对象申请一个内存,该变量会存储指向该对象内存中的地址 这 ...