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)可以判断运行时 ...
随机推荐
- 【机器学习实战】计算两个矩阵的成对距离(pair-wise distances)
矩阵中每一行是一个样本,计算两个矩阵样本之间的距离,即成对距离(pair-wise distances),可以采用 sklearn 或 scipy 中的函数,方便计算. sklearn: sklear ...
- AndroidStudio3.0升级成3.5后之前项目报错解决
报错截图: 解决办法:在项目的build.gradle文件下加上google即可,如图:
- Netfilter,获取http明文用户名和密码
目录 Netfilter简介 实验-target端 内核模块的操作 初始化netfilter 解析http包,获取用户名和密码 实验-hack端 遇到的问题 @ Netfilter简介 Netfilt ...
- MySQL5.6与MySQL5.7安装的区别
一.MySQL5.6与MySQL5.7安装的区别 1.cmake的时候加入了boost 下载boost.org 2.初始化时 cd /application/mysql/bin/mysql 使用mys ...
- python 中model.py详解
model详解 Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建表 基本结构 from django.db import models # Creat ...
- 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了
看到论坛上各种贴子写用python进行暴力破解的文章,于是自己也想去尝试一下,不试不知道,一试吓一跳,真的就像那句有名的”python由入门到放弃“,把论坛上别人的脚本全部自己敲一遍,运行不报错,但也 ...
- C# 让你解决方案乱七八糟的DLL放入指定文件夹
嗯,大家的解决方案可能会有许多dll,这样不美观,而且也麻烦. 很多小白都不知道如何将这些dll放到如自己程序的bin文件夹下. 本渣今天来试着将dll复制到指定的文件夹下~ 比如我之前做的一个Win ...
- 使用python执行系统命令——subprocess
背景:subprocess是python官方推荐调用系统命令的模块 import subprocess subprocess最主要的两个方法/类: # 参数说明:stdin和stdout相当于一个管 ...
- 查看 Java Web 开发环境软件是 32 位还是 64 位
这里 Java Web 的开发环境指的是:Java + Tomcat + Eclipse 查看 Java 的版本 java -version 结果: JDK 版本位 1.8.0\_221 而且是 64 ...
- 2019阿里天猫团队Java高级工程师面试题之第二面
2019阿里天猫团队Java高级工程师面试题之第一面 2019阿里天猫团队Java高级工程师面试题之第三面 1.Tomcat的基本架构是什么? https://blog.csdn.net/xlgen1 ...