Java反射01 : 概念、入门示例、用途及注意事项
1.Java反射定义
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79360452
官方定义如下:
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use
reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
译文:
Java反射使得Java代码能够获取运行期被加载类的字段、方法和构造器的相关信息,并且能够在安全范围内对这些反射的字段、方法和构造器进行相应的操作。
2.Java反射入门示例
Java反射主要类:
- 类:java.lang.Class;
- 构造器:java.lang.reflect.Constructor;
- 字段:java.lang.reflect.Field;
- 方法:java.lang.reflect.Method;
- 修饰符:java.lang.reflect.Modifier;
下面是入门示例代码:
ReflectDemo1.java
/**
* 反射入门示例
*/
public class ReflectDemo1 {
public Integer demo; public ReflectDemo1(Integer demo) {
this.demo = demo;
} public Integer getDemo() {
return demo;
} public void setDemo(Integer demo) {
this.demo = demo;
} @Override
public String toString() {
return "ReflectDemo1{" +
"demo=" + demo +
'}';
}
}
ReflectIntroductionDemo.java
public class ReflectIntroductionDemo {
private final static Logger LOGGER = Logger.getLogger(ReflectIntroductionDemo.class);
/**
* <p>Title: Java反射入门示例</p>
*/
public static void main(String[] args) throws Exception {
Class dClass = ReflectDemo1.class;
LOGGER.info("获取类信息Class对象:" + dClass);
Field field = dClass.getField("demo");
LOGGER.info("通过Class对象 获取字段信息Field:" + field);
Constructor constructor = dClass.getDeclaredConstructor(Integer.class);
LOGGER.info("通过Class对象 获取构造函数Constructor: " + constructor);
ReflectDemo1 demo1 = (ReflectDemo1) constructor.newInstance(1);
LOGGER.info("通过Constructor对象 创建对象:" + demo1.toString());
Method method = dClass.getDeclaredMethod("getDemo");
LOGGER.info("通过Class对象 获取方法Method:" + method);
Integer integer = (Integer) method.invoke(demo1);
LOGGER.info("通过Method对象 操作对象 : public Integer getDemo() = " + integer);
LOGGER.info("通过Class对象 获取修饰符Modifier:" + Modifier.toString(dClass.getModifiers()));
LOGGER.info("通过Field对象 获取修饰符Modifier:" + Modifier.toString(field.getModifiers()));
LOGGER.info("通过Method对象 获取修饰符Modifier:" + Modifier.toString(field.getModifiers()));
LOGGER.info("通过Constructor对象 获取修饰符Modifier:" + Modifier.toString(constructor.getModifiers()));
}
}
运行结果:
INFO ReflectIntroductionDemo:23 - 获取类信息Class对象:class pers.hanchao.reflect.Introduction.ReflectDemo1
INFO ReflectIntroductionDemo:26 - 通过Class对象 获取字段信息Field:public java.lang.Integer pers.hanchao.reflect.Introduction.ReflectDemo1.demo
INFO ReflectIntroductionDemo:29 - 通过Class对象 获取构造函数Constructor: public pers.hanchao.reflect.Introduction.ReflectDemo1(java.lang.Integer)
INFO ReflectIntroductionDemo:31 - 通过Constructor对象 创建对象:ReflectDemo1{demo=1}
INFO ReflectIntroductionDemo:34 - 通过Class对象 获取方法Method:public java.lang.Integer pers.hanchao.reflect.Introduction.ReflectDemo1.getDemo()
INFO ReflectIntroductionDemo:36 - 通过Method对象 操作对象 : public Integer getDemo() = 1
INFO ReflectIntroductionDemo:38 - 通过Class对象 获取修饰符Modifier:public
INFO ReflectIntroductionDemo:39 - 通过Field对象 获取修饰符Modifier:public
INFO ReflectIntroductionDemo:40 - 通过Method对象 获取修饰符Modifier:public
INFO ReflectIntroductionDemo:41 - 通过Constructor对象 获取修饰符Modifier:public
总结:
- Class 类的实例表示正在运行的 Java 应用程序中的类和接口。Java反射操作基本上都是基于Class类的。
- 获取Class类的实例有三种方式,在后续章节中再详细讲解。
- 通过Class可以获取一个类的字段、方法和构造器,也就是Field、Method和Constructor类的实例。
- 通过Field、Method和Constructor类的实例可以动态的操作这些字段、方法和构造器,例如创建对象、调用方法等等。
3.Java反射用途
Java反射的常见应用场景如下:
- IDE中的各类插件:如在一个对象后面输入一个 . 号,IDE会自动列出相关的属性和方法等。
- 反射机制是很多Java框架的基石:如MyBatis通过XML映射文件自动创建Dao层实例化对象等。
- 逆向工程:例如反编译等。
4.Java反射注意事项
Java反射优点:
在运行期确定对象、绑定对象、操作对象,最大限度的发挥了Java的灵活性。
Java反射缺点:、
- 反射相当于一系列解释操作,通知jvm要做的事情,性能相对较低。
- 反射会跳过类型检查等,导致安全性问题。例如通过反射跳过泛型的编译前类型检查(参考:Java泛型05 : 泛型使用的8个限制)。
总结:
- 业务代码中不建议使用Java反射
- 开发框架中一定会用到Java反射
Java反射01 : 概念、入门示例、用途及注意事项的更多相关文章
- Android中Java反射技术的使用示例
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...
- Java反射机制概念及应用场景
Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机制是在运行状态中,对于任意一个类 ...
- java 反射的概念
反射的引入: Object obj = new Student(); 若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法: 1.若编译和运行类型 ...
- Java反射机制概念及使用
反射机制 —— 将类中的所有成员反射成对于的类. 以“com.test.Person”类为例 转换对应的类 获取方法 ...
- Java反射的简单入门
1.Class的简单介绍 Class类的类表示正在运行的Java应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...
- 乐字节Java反射之一:反射概念与获取反射源头class
一.Java反射机制概念 “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”,如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAVA有着一个非常突出 ...
- 非常好的Java反射例子
1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到pr ...
- java反射 实例
首先介绍几个概念: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反 ...
- 【转】非常好的Java反射例子
转自 http://www.douban.com/note/306848299/ 原文: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时 ...
随机推荐
- 分享一个web安全学习站点
大神建议: https://blog.knownsec.com/Knownsec_RD_Checklist/v3.0.html#FMID_1218170279FM https://websec.rea ...
- Android App内文档展示方案整理
一.Word.Excel.PPT 展示 1. 微软Office公开Api接口 如果文档内容不是很机密或者只是需要实现预览文档的话,可以考虑使用微软的公共Api接口实现. 微软Office公开Api地址 ...
- 写完代码就去吃饺子|The 10th Henan Polytechnic University Programming Contest
河南理工大学第十届校赛 很久没有组队打比赛了,好吧应该说很久没有写题了, 三个人一起玩果然比一个人玩有趣多了... 前100分钟过了4题,中途挂机100分钟也不知道什么原因,可能是因为到饭点太饿了?, ...
- Rancher2.x流水线自动化部署
1.概述 由于一些项目使用了rancher进行部署发布,所以使用Rancher的流水线自动部署功能实现CICD,从gitlab.harbor安装,到流水线配置和中间的一些问题一一进行详细介绍解答. 2 ...
- Entity Framework Core Code First 项目实践
Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...
- forEach和map的区别,简单写了IE低版本的原形封装
今天有点'不务正业',旧的没有写完又开新的,没办法 -0- 今天遇到这个特感兴趣嘛入正题了 forEach 和 map 的区别 参考:http://blog.csdn.net/boysky0015/a ...
- Android-再次解读萤石云视频
### 前言 我之前写过一篇萤石云的集成文章,很多人问我有没有demo, 今天我再次总结一下, 并加个些功能. - 集成步骤 - 视频预览播放 - 视频放大缩小 - 视频的质量切换 - 截图 - 视频 ...
- Andriod安卓下开发UHF读写器
随着在Andriod设备上使用UHF读写器变得越来越广泛,友我科技独立研发了UHF读写器的android开发包,使用此开发包,工程师只需在工程中导入jar包,使用java语言就可以轻松的开发出Andr ...
- 学习之Redis(二)
Redis的对象和数据结构 一.字符串对象(请参考学习之Redis(一):https://www.cnblogs.com/wbq1994/p/12029516.html) 二.列表对象 列表对象的编码 ...
- PC上装VM上装虚拟机
1.虚拟机网卡选择桥接模式 2.查看本PC机的网络 3.到/etc/sysconfig/network-scripts,修改网卡,vi ifcfg-ens33 4.重新/etc/init.d/netw ...