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)可以判断运行时 ...
随机推荐
- 使用git将本地java项目上传到GitHub
使用git将项目上传到github(最简单方法) 声明:本人是根据上文给的链接的方式,上传到github上的,亲测有效. 首先你需要一个github账号,所有还没有的话先去注册吧! https://g ...
- 精通awk系列(16):gawk支持的正则表达式
回到: Linux系列文章 Shell系列文章 Awk系列文章 gawk支持的正则 . # 匹配任意字符,包括换行符 ^ $ [...] [^...] | + * ? () {m} {m,} {m,n ...
- Java连载60-类之间的六种关系
一.类之间的关系 1.泛化关系(UML图:实线空心三角形箭头,箭头指向被继承方) 类和类.接口与接口之间的继承称为泛化关系 public class A {} class B extends A{} ...
- vivo web service:亿万级规模web服务引擎架构
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/ovOS0l9U5svlUMfZoYFU9Q vivo web service是开发团队围绕奇点 ...
- laravel大量填充项目测试数据的正确方法
项目开发时,一般都会有到项目测试数据的准备操作,以前都是基于PHP代码自主编写sql语句,然后循环的插入到数据库中里面,当当我们接触过laravel数据库后,就可以很方便的完成项目的测试数据准备. 但 ...
- [转]为何选择 Flink
本文转自:https://www.ituring.com.cn/book/tupubarticle/23229 第 1 章 为何选择 Flink 人们对某件事的正确理解往往来自基于有效论据的结论.要获 ...
- svn忽略文件不提交至服务器的方法
在提交界面,右键加入忽略提交列表.可以实现忽略本地文件不提交,且不删除服务器上的文件.
- 使用vsphere client 克隆虚拟机的具体操作步骤
采用 VMWare ESXi6.0,使用ESXi经常会遇到这样的问题,需要建立多个虚拟机,都是一样的操作系统,但是如果一台台装效率太低. VMware ESXi.VMware vCenter Serv ...
- docker下MySQL的主从复制
MySql的主从复制 sudo docker pull MySQL:5.7 拉取MySQL的镜像文件(版本号为 5.7) sudo docker run -p 3339:3306 --name mas ...
- [Go]TCP服务中读写进行协程分离
读写两部分进行一下分离,中间通过chan进行传递数据 ,这样可以方便的在write中进行一些业务处理 single/snet/tcpconn.go package snet import ( &quo ...