提到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学习:反射的应用场景和解析方法相关推荐

  1. java中人民币的符号怎么打_Java学习笔记---字符串操作(人民币大写转换的实现)...

    向开始学习语言的的同学们推荐下,如果你想学习语言的某个特性,比方说数据库编程,或者网络编程,最好找一个实用的例子,然后不懂的去翻书,去查资料,这样目的性就很强了,个人感觉比对着语法书敲上面的例子效率要 ...

  2. java中预编译是啥意思_JAVA学习笔记预编译

    JAVA学习笔记预编译 (2011-07-30 02:36:17) 标签: 杂谈 第顺次运行jsp时jsp将被改换成servlet(第顺次工夫较长,而尔后就会快许多) 搭配好的利用过程能够穿越设置js ...

  3. java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...

    java中的return this什么时候用,返回的是类里面的方法类型,还是实例类??下面的代码什么意思? public class RoleService extends BaseService { ...

  4. java中的class 类的作用_Java中Class和单例类的作用与类成员的理解

    Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...

  5. java的反射技术_Java学习——反射技术

    1. 反射机制介绍_Class对象获取 (1) 什么是(Reflection)反射?其它语言有这种特点吗? 答:动态语言:在程序运行时,可以改变程序的结构或变量的类型.典型的动态语言"Pyt ...

  6. java中属性是什么意思啊_Java中的字段和属性到底有什么区别?

    Java中的字段和属性到底是什么?他们的含义真的是相同的吗?如果不同,那他们到底又分别是何含义呢? 相信上面的问题,对于很多Java初学者都是相当困惑的,但是好像把他们理解为一个含义也没啥问题,很多J ...

  7. java中基本字节输出流类是_java中基本输入输出流的解释

    网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...

  8. java中char是几个字节_Java中char占用几个字节

    在讨论这个问题之前,我们需要先区分unicode和UTF. unicode :统一的字符编号,仅仅提供字符与编号间映射.符号数量在不断增加,已超百万.详细:[https://zh.wikipedia. ...

  9. java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势

    image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...

最新文章

  1. common lisp里的几个操作符
  2. java 对象转json,java首字母小写,判断方法是否为javabean方法
  3. GCC Inline ASM GCC内联汇编
  4. kafka 集群服役新节点
  5. 实验4-1-8 求给定精度的简单交错序列部分和 (15 分)
  6. 解决方案售前的知识管理解决方案
  7. vb.net机房收费系统之组合查询
  8. 两个不同的list合并_Stata:数据合并与匹配mergereclink
  9. 【优化预测】基于matlab灰狼算法优化BP神经网络预测【含Matlab源码 1728期】
  10. linux kill
  11. Python爬取百度图片(高清原图)
  12. Elasticsearch根据日期(年-月-日 时:分:秒)进行range(时间范围筛选)
  13. 今天是个天气晴朗的日子
  14. SSM框架体会和小结(短学期实训)
  15. 【运放学习】:虚短、虚短、虚地、深度负反馈
  16. 建筑计算机辅助设计证书,学术讲座:计算机辅助设计绘图员(建筑类)职业技能鉴定...
  17. Spring Boot 启动成功
  18. Python有什么用?Python 的 10 个实际用途
  19. html5上一个版本是什么意思,H5是什么意思?H5是怎么发展来的?
  20. BLAST背后的知识(一点原理)

热门文章

  1. 有关上次的字符串是否相等的比较
  2. Zookeeper安装,Zookeeper单机模式安装
  3. sql左右连接的区别
  4. Office 365系列之八:配置和体验Exchange和Lync
  5. Symfony1.4.11学习笔记(四):数据模型
  6. 时间同步失败_关于同步、异常处理的思考
  7. python带我起飞_Python带我起飞:入门、进阶、商业实战
  8. python爬取系统_python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说...
  9. 解析xml文件的几种技术
  10. 软件产品质量要求与评价_软件质量模型