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)可以判断运行时 ...
随机推荐
- github pages 子域名 ( subdomain ) https 认证
目录 说明 github pages 上的创建子域名 https 认证 说明 转载请注明出处https://www.cnblogs.com/bllovetx/p/12013462.html 欢迎访问我 ...
- Android 音视频技术之录音获取实时音量
一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...
- Oracle转SqlServer
基础数据所对应的类型不同 在Oracle中有一些基础类型与Sqlserver中名字一样,但是所存储的数据格式不同,Date类型在Oracle中精确到秒,在Sqlserver中只能精确到天 表的结构 O ...
- 面试连环炮系列(二):你们的项目Redis做了集群部署吗
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...
- 精通awk系列(10):awk筛选行和处理字段的示例
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk数据筛选示例 筛选行 # 1.根据行号筛选 awk 'NR==2' a.txt # 筛选出第二行 awk 'NR>=2' a ...
- C#中的Skip()和Take()
Skip()和Take()方法都是IEnumerable<T> 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串 ...
- 深入浅出 PHP SPL(PHP 标准库)(转)
一.什么是spl库? SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 此扩展只能在php 5.0以后使用,从PHP 5.3.0 不再被关闭,会一直有效.成为php ...
- Cookie插件的使用
jQuery-cookie插件的使用 什么是插件? 基于jQuery的语法,按照一定规范书写,具有特定功能的脚本文件,称为插件. 插件除了js文件之外,有的还包含css文件,图片和字体等资源文件. 在 ...
- PHP 日期之间所有日期
/** * 获取起止日期之间所有日期 * @param $sdate * @param $edate * @return array */ function get_dates($sdate, $ed ...
- [转]自定义UiPath Activity实践
本文转自:https://segmentfault.com/a/1190000017440647 为了对UiPath Activity的实现方式一探究竟,自己尝试实践编写了一个简单的Activity, ...