Java中反射主要应用在哪里_Java学习:反射的应用场景和解析方法
提到java语言的高级特性,反射绝对是Top1级别的,在大量开源框架中的应用范例比比皆是,那么需要了解清楚反射到底是什么?为什么要使用反射?如何使用反射?(what,why,how)
什么是反射?
正常场景下,java从源码到运行有3个阶段:
source class runtime
反射提供的是runtime阶段获取类的class实例、方法、属性、注解,并且能够调用类的方法的途径,这种动态获取类信息和调用类方法的机制被称之为反射
为什么要使用反射?
正常的实例化一个对象
ClassA objA = new ClassA();
objA.sayHello();
通过反射去实例化一个对象
Class objA = ClassA.class;
Method method = objA.getMethod("sayHello");
method.invoke(objA.newInstance());
在source阶段实际上二者并无任何区别,反射也没有体现出任何的优势,那么任何一个java开发人员必然会问为什么要使用反射?
反射的重点在于runtime阶段的获取类信息和调用类方法,那么当你的编码过程中中有“部分信息是source阶段不清晰,需要在runtime阶段动态临时加载”这种场景,反射就可以派上用场了
我们考虑几个编码场景:
1、编码阶段不知道需要实例化的类名是哪个,需要在runtime从配置文件中加载:
Class clazz = class.forName("xxx.xxx.xxx")
clazz.newInstance();
2、在runtime阶段,需要临时访问类的某个私有属性
ClassA objA = new ClassA();
Field xxx = objA.getClass().getDeclaredField("xxx")
xxx.setAccessible(true);
所以,反射的优点在于“有些编码需求在source阶段无法实现,只能在runtime阶段通过反射实现”,而非“source阶段正常编码方式能解决的,反射的方式能解决的更好”,所以比较反射和正常编码方式的优劣是没有意义的,反射解决的是正常编码无法解决的编码场景,如果正常编码方式可以解决的,强行使用反射反而是毫无意义的,编码不是为了show技巧。
反射应用范例代码
实现对类或者对象的构造器、方法、属性、注解的获取和操作,具体作用见代码中的注释描述
public class ReflectionHelper {
/**
* Reflection Test Code
*
* @param args
*/
public static void main(String[] args) {
SSHClient sshClient = new SSHClient();
// 获取class名称
System.out.println("01-----获取class名称-----");
System.out.println(sshClient.getClass().getName());
System.out.println(sshClient.getClass().getSimpleName());
System.out.println(sshClient.getClass().getTypeName());
Class> clazz1 = null;
Class> clazz2 = null;
Class> clazz3 = null;
// 获取对象或者类的Class实例
try {
clazz1 = Class.forName(sshClient.getClass().getName());
clazz2 = sshClient.getClass();
clazz3 = ReflectionUtils.class;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取类的构造函数,用构造函数实例一个对象
for (Constructor> clazz1Cstor : clazz1.getConstructors()) {
System.out.println(clazz1Cstor.getName());
try {
SSHClient client1 = (SSHClient) clazz1.newInstance();
SSHClient client2 = (SSHClient) clazz1Cstor.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
// 获取类定义的方法、属性
System.out.println("02-----获取类定义的方法、属性-----");
try {
SSHClient client = (SSHClient) clazz1.newInstance();
Method setHostMethod = clazz1.getDeclaredMethod("setHost", String.class);
setHostMethod.invoke(client, "111");
Field field = client.getClass().getDeclaredField("host");
field.setAccessible(true);
System.out.println(field.get(client));
field.set(client,"a new host");
System.out.println(field.get(client));
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
// 获取类的注解
System.out.println("03-----获取类使用的注解-----");
for (Annotation annotation : clazz1.getAnnotations()) {
System.out.println(annotation.getClass().getName());
System.out.println(annotation.toString());
System.out.println(annotation.annotationType());
}
}
}
运行结果:
Java中反射主要应用在哪里_Java学习:反射的应用场景和解析方法相关推荐
- java中人民币的符号怎么打_Java学习笔记---字符串操作(人民币大写转换的实现)...
向开始学习语言的的同学们推荐下,如果你想学习语言的某个特性,比方说数据库编程,或者网络编程,最好找一个实用的例子,然后不懂的去翻书,去查资料,这样目的性就很强了,个人感觉比对着语法书敲上面的例子效率要 ...
- java中预编译是啥意思_JAVA学习笔记预编译
JAVA学习笔记预编译 (2011-07-30 02:36:17) 标签: 杂谈 第顺次运行jsp时jsp将被改换成servlet(第顺次工夫较长,而尔后就会快许多) 搭配好的利用过程能够穿越设置js ...
- java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...
java中的return this什么时候用,返回的是类里面的方法类型,还是实例类??下面的代码什么意思? public class RoleService extends BaseService { ...
- java中的class 类的作用_Java中Class和单例类的作用与类成员的理解
Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...
- java的反射技术_Java学习——反射技术
1. 反射机制介绍_Class对象获取 (1) 什么是(Reflection)反射?其它语言有这种特点吗? 答:动态语言:在程序运行时,可以改变程序的结构或变量的类型.典型的动态语言"Pyt ...
- java中属性是什么意思啊_Java中的字段和属性到底有什么区别?
Java中的字段和属性到底是什么?他们的含义真的是相同的吗?如果不同,那他们到底又分别是何含义呢? 相信上面的问题,对于很多Java初学者都是相当困惑的,但是好像把他们理解为一个含义也没啥问题,很多J ...
- java中基本字节输出流类是_java中基本输入输出流的解释
网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...
- java中char是几个字节_Java中char占用几个字节
在讨论这个问题之前,我们需要先区分unicode和UTF. unicode :统一的字符编号,仅仅提供字符与编号间映射.符号数量在不断增加,已超百万.详细:[https://zh.wikipedia. ...
- java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势
image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...
最新文章
- common lisp里的几个操作符
- java 对象转json,java首字母小写,判断方法是否为javabean方法
- GCC Inline ASM GCC内联汇编
- kafka 集群服役新节点
- 实验4-1-8 求给定精度的简单交错序列部分和 (15 分)
- 解决方案售前的知识管理解决方案
- vb.net机房收费系统之组合查询
- 两个不同的list合并_Stata:数据合并与匹配mergereclink
- 【优化预测】基于matlab灰狼算法优化BP神经网络预测【含Matlab源码 1728期】
- linux kill
- Python爬取百度图片(高清原图)
- Elasticsearch根据日期(年-月-日 时:分:秒)进行range(时间范围筛选)
- 今天是个天气晴朗的日子
- SSM框架体会和小结(短学期实训)
- 【运放学习】:虚短、虚短、虚地、深度负反馈
- 建筑计算机辅助设计证书,学术讲座:计算机辅助设计绘图员(建筑类)职业技能鉴定...
- Spring Boot 启动成功
- Python有什么用?Python 的 10 个实际用途
- html5上一个版本是什么意思,H5是什么意思?H5是怎么发展来的?
- BLAST背后的知识(一点原理)
热门文章
- 有关上次的字符串是否相等的比较
- Zookeeper安装,Zookeeper单机模式安装
- sql左右连接的区别
- Office 365系列之八:配置和体验Exchange和Lync
- Symfony1.4.11学习笔记(四):数据模型
- 时间同步失败_关于同步、异常处理的思考
- python带我起飞_Python带我起飞:入门、进阶、商业实战
- python爬取系统_python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说...
- 解析xml文件的几种技术
- 软件产品质量要求与评价_软件质量模型