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)可以判断运行时 ...
随机推荐
- Visual Studio中相对路径中的宏定义
$(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被添加到 ...
- web 自动化遇到 shadowDOM 节点你会操作吗?
本文转载自: http://www.lemfix.com/topics/971 近期有同学在做web自动化的时候,发现页面上有些元素,在selenium中无法通过xpath来定位,各种原因找了半天,都 ...
- 传统js和jsx与ts和tsx的区别
一.从定义文件格式方面说 1.传统的开发模式可以定义js文件或者jsx文件2.利用ts开发定义的文件格式tsx二.定义state的状态来说 1.传统的方式直接在构造函数中使用 constructor( ...
- C# Newtonsoft.Json JsonSerializerSettings配置
JsonSerializerSettings常用配置整理 1.忽略某些属性 MemberSerialization.OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonPro ...
- SecureCRT远程连接The remote system refused the connection问题
今天用SecureCRT远程连接Linux(Centos 7)时,连不上,报错The remote system refused the connection.于是就百度,首先查看sshd服务有没有启 ...
- Maven pom.xml文件深度学习
本文介绍Maven项目构建中,pom.xml文件的生成规则和常用节点的使用方法.pom.xml官方网址:http://maven.apache.org/pom.html pom简介 pom作为项目对象 ...
- Nlog配置
初次使用nlog,里里外外找了好久,终于搞会了. 使用nlog建日志输出到txt文件.数据库.邮件 nlog配置,如图 码云dome
- JavaScript设计模式基础(一)
模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...
- JEB 无源码调试 以dvm smali字节码方式,Demo尝试
关于调试器看不到进程,无法attach的问题,网上也有很多教程,基本是修改ro.debugable =1 ,ro.secure = 0 让adbd有root权限 attach到其他进程,涉及到要修改 ...
- 解决Android Screen Monitor在android8.0及以上系统报错:"E/Screenshot: Unsupported protocol: 2"
1.打开命令窗口,切换到 asm.jar 所在目录,执行 java -jar asm.jar,正常情况下打开后连接上设备会显示出画面 2.但是在android8.0以上系统该asm.jar包就无法正常 ...