1.Class对象获取的三种方式

本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463

上一章节已经说过,一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。

  1. 公有属性class
  2. 方法getClass()
  3. 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实例化对象,我们还可以通过反射实例化对象对象,有两种方式:

  1. Class.newInstance()
  2. 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'}

总结:

  1. 通过Class.newInstance()进行对象实例化:实际调用的是无参数的构造函数进行实例化。
  2. 通过Constructor.newInstance()进行对象实例化:可以选择调用哪个构造函数进行实例化。

Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式的更多相关文章

  1. java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?

    String类型是实际工作中经经常使用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象能够用new创建,比如String name=new S ...

  2. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  3. Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  4. 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

    当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...

  5. C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...

  6. c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>

    c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...

  7. Java常见重构技巧 - 去除不必要的!=null判断空的5种方式,很少有人知道后两种

    常见重构技巧 - 去除不必要的!= 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?@pdai 常见重构技巧 - 去除不必要的!= 场景一:null无意义之常规判断空 ...

  8. 获取select文本框的下拉菜单文字内容的两种方式

    <body> <div class="box"> <select id="sel"> <option value=&q ...

  9. 获取表单选中的值(利用php和js两种方式)

    php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...

随机推荐

  1. confluence 挖矿木马应急响应

    最近遇到一台confluence wiki主机被挖矿,收到CPU 告警异常之后,登录查看,进行分析. top c 命令查看,果然CPU 已经资源已经被吃完了.. 看到用户是confluence,100 ...

  2. Hystrix集群及集群监控turbine

    Hystrix集群及监控turbine 前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine. turbine是基于Dashboard的. 先搞个 ...

  3. .Net Core WebApi 模型验证无效时报400

    问题 模型验证无效时,没有进入到接口里,而是直接报400 Bad Request,非常不友好. 环境 SDK:.Net Core 2.2.401 开发工具:VS2017 step 1 创建接口 /// ...

  4. django找不到模板的错误处理django.template.exceptions.TemplateDoesNotExist: blog/list.html

    错误提示如下图: 程序出错对于程序员而言是最常见的,一般解决的要点是看清错误提示(读懂英文很重要) 根据错误提示 blog\list.html这个文件不存在,也就是没找到资源 这个时候需要去检查有没有 ...

  5. WPF炫酷UI及动画

    偶然看见了一张图,感觉挺好看的,花了点时间将他转化成了我代码仓库的一部分.虽然不难但也费时间.其中除了背景是百度的一张底图,其他所有内容均通过WPF的Path.Line.TextBlock.Borde ...

  6. P1356 数列的整除性

    dp百题进度条[2/100] 题目链接 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数 ...

  7. css知识笔记:水平垂直居中(别只看,请实操!!!)

    css实现元素的水平垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目 ...

  8. Windows添加自定义开机用户登录启动程序

    默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...

  9. tp、tftp、nfs--服务器搭建

    服务器 1. ftp服务器 1.1检查是否安装 vsftpd -version 1.2 安装 sudo apt-get install vsftpd 1.3卸载 sudo apt-get remove ...

  10. [日常] linux设置环境变量

    比如首先在/etc/profile里面增加这几个环境变量 export PATH=$PATH:/mnt/f/ubuntu/goProject/go/binexport GOROOT=/mnt/f/ub ...