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= ...
随机推荐
- Android 线性布局 计算器
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- C#的语法----程序结构(3)
练习2 对于学员成绩的评测 成绩>=90:A 成绩>=80&&成绩<90:B 成绩>=70&&成绩<80:C 成绩>=60& ...
- C++ std::deque 基本用法
#include <iostream> #include <string> #include <deque> // https://zh.cppreference. ...
- SpringCloud服务过滤filter
一.目录展示 二.application.yml配置文件 三.MyZuulFilter package com.zn.filter; import com.netflix.zuul.ZuulFilte ...
- [debug] 解决新建项目属性中没有 c\c++
写一些代码(不写不行),然后生成,然后就可以看到这个选项了
- MySQL数据库~~~~~索引
1. 索引 索引在MySQL中也叫"键"或者"key",是存储引擎于快速找到记录的一种数据结构. 索引的数据结构: B+树 B+树性质: 索引字段要尽量小; 索 ...
- C# 类库项目 无法创建 “资源字典” 文件
1.接触WPF有两个月时间了,准备自己写一个样式库,在vs新建 类库项目后无法创建资源字典. 2.解决办法: 打开项目工程文件 ( project.csproj) 在 <Proper ...
- s3c2440裸机-异常中断(一. 异常、中断的原理与流程)
1.异常中断概述 在arm架构的处理器中,cpu有7中工作模式,2中工作状态. 1.CPU模式(Mode): 7种Mode: 除了usr/sys,其他5种都是异常模式.我们知道中断属于异常的2中,中断 ...
- 新手学Html之JSP基础语法——入门(二)
JSP基础语法 JSP注释 comment.jsp <%@ page language="java" contentType="text/html; charset ...
- Appium(三):安装appium client、adb命令
1. 安装appium client appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好的用例. appium client是配合原生 ...