从代码角度,关于反射的用法总结

一、概念

1.1 概念

简单说,JAVA反射机制是指在运行态可直接操作任意类或对象的所有属性和方法的功能,无论他是私有还是public。

1.2 反射的用途

  • 在运行时获取任意对象所属的类
    Class<?> clazz = Class.forName(String className);
  • 在运行时构造任意类的对象
    Object obj = clazz.newInstance();
  • 在运行时获取任意类所具有的成员变量和方法
    field.set(Object obj, Object value);
    field.get(Object obj);
  • 在运行时调用任意对象的方法 (最常见的需求,尤其是当该方法是私有方法或者隐藏方法)
    method.invoke(Object obj, Object... args);

反射还可以获取类的其他信息,包含modifiers(下面会介绍),以及superclass, 实现的interfaces等。

针对动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。反射机制在运行时只能调用methods或改变fields内容,却无法修改程序结构或变量类型。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

二、反射

2.1 核心类

  • java.lang.Class: 代表类
  • java.lang.reflect.Constructor: 代表类的构造方法
  • java.lang.reflect.Field: 代表类的属性
  • java.lang.reflect.Method: 代表类的方法
  • java.lang.reflect.Modifier:代表类、方法、属性的描述修饰符。

其中Modifier取值范围如下:
public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp, interface。

Constructor, Field, Method这三个类都继承AccessibleObject,该对象有一个非常重要的方法setAccessible(boolean flag), 借助该方法,能直接调用非Public的属性与方法。

2.2 核心方法

1.成员属性(Field):

getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getField(String name)
getDeclaredField(String name):获取类的特定属性

2.成员方法(Method):

getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法
getDeclaredMethod(String name, Class[] parameterTypes):获得类的特定方法

3.构造方法(Constructor):

getConstructors():获得类的public类型的构造方法。
getDeclaredConstructors():获得类的所有构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法
getDeclaredConstructor(Class[] params);获得类的特定方法

2.3 深入Class类

Java所有的类都是继承于Oject类,其内声明了多个应该被所有Java类覆写的方法:hashCode()、equals()、clone()、toString()、notify()、wait()、getClass()等,其中getClass返回的便是一个Class类的对象。Class类也同样是继承Object类,拥有相应的方法。

Java程序在运行时,运行时系统对每一个对象都有一项类型标识,用于记录对象所属的类。虚拟机使用运行时类型来选择相应方法去执行,保存所有对象类型信息的类便是Class类。

Class类没有公共构造方法,Class对象是在加载类时由 Java 虚拟机以及通过调用ClassLoader的defineClass 方法自动构造的,因此不能显式地声明一个Class对象。

虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。

基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

三、用处

1.如何通过反射获取一个类?

Class.forName(String className); (最常用)

2.如何调用私有类,或者类的私有方法或属性?

  • 私有类: 通过getDeclaredConstructor获取constructor,再调用constructor.setAccessible(true);
  • 私有方法:通过getDeclaredMethod获取method,再调用method.setAccessible(true);
  • 私有属性:通过getDeclaredField获取field,再调用field.setAccessible(true);

3.@hide标记是做什么的,反射能否调用@hide标记的类?

在Android的源码中,我们会发现有很多被”@hide”标记的类,它的作用是使这个类或方法在生成SDK时不可见。那么应用程序便不可以直接调用。而反射机制可调用@hide标记的类或方法,如入无人之地,畅通无阻。

4.如何通过反射调用内部类?

假设com.reflect.Outer类有一个内部类inner,调用方法如下:

String className = "com.reflect.Outer$inner";
Class.forName(className);

四、参考

  1. JDK7官方英文文档 http://docs.oracle.com/javase/7/docs/api/
  2. JDK6中文文档 http://tool.oschina.net/uploads/apidocs/jdk-zh/
  3. Java 反射机制深入研究 http://lavasoft.blog.51cto.com/62575/43218/
  4. Android反射机制实现与原理 http://blog.csdn.net/annaleeya/article/details/8240510

JAVA 反射知识点总汇相关推荐

  1. java android知识点总汇

    声明:软件下载地址由于地址太长,变成了短地址,有点广告,5秒以后,点击跳过广告就可以到下载地址了,忘大家支持一下,通过配置一定能成功配置,有疑问可以直接问.O(∩_∩)O哈哈~ 转http://adf ...

  2. java 反射.问题_Java知识点总结(反射-反射机制性能问题)

    Java知识点总结(反射-反射机制性能问题) @(Java知识点总结)[Java, 反射] 性能相关注意点: setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象 ...

  3. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  4. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...

    Java基础 5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下 会抛出一个封装了错误信息的对象.此时, ...

  5. java反射有什么用_java反射的作用知识点总结

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助. 什么是Java的反射? 反射是Java的特征之一,是一种间接操作 ...

  6. 测试开发必须掌握的知识点:Java反射

    Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时通过Reflection APIs取得任何一个已知名称的class的内部信息以及任意一个对象的内部信息. Spr ...

  7. Java反射详细介绍

    反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...

  8. Java反射机制--笔记

    1.认识Class类 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式. 1 /*java 反射机制*/ 2 // 获取类的方法 3 UserDao userDao = new Use ...

  9. Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

    Java反射机制大神必学系列之 ,高级与低级的差别在哪里? java学习爱好者 2019-05-20 19:08 前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来 ...

最新文章

  1. AIoT开放平台及应用
  2. java 数字三角形_数字三角形 Number Triangles(java的MLE解决办法)
  3. vivado中的rtl中电路图无发生成_FPGA零基础学习:数字电路中的组合逻辑
  4. linux怎么知道ping命令,教程方法;通过ping命令查看服务器类型(linux还是windows系列)电脑技巧-琪琪词资源网...
  5. 羽毛球 机器人 Robocon 2015 泰国预选赛(全国大学生机器人竞赛)
  6. amr文件格式分析【转http://blog.csdn.net/dinggo/article/details/1966444】
  7. Sql语句中IN和exists的区别及应用
  8. 【转】8 个效果惊人的 WebGL/JavaScript 演示
  9. HTTP协议发展历程
  10. 再谈PN学习(Tracking-Learning-Detection)
  11. Netty 中的心跳机制,还有谁不会?
  12. Android View框架总结(四)View布局流程之Measure
  13. Ceph 撸源码系列(二):Ceph源代码里的那些锁 std::mutex(2 of 3)
  14. Linux下的指令:tail
  15. Rust: 如何读写中文字符?
  16. 2022-2028中国安全代码审查软件市场现状研究分析与发展前景预测报告
  17. MATLAB中的小技巧
  18. vue-router升级3.0.0以上版本导致Uncaught(in promise) navigation guard报错问题
  19. 爱创课堂源生javascript 共150课时
  20. 开始接触tinyOS

热门文章

  1. 中科院亚热带生态所赵杰:喀斯特生态系统土壤微食物网组成与功能
  2. 一个课题组两篇Cell发布病毒与宿主相互作用重要研究
  3. 终极大招——怎么在学术会议上有所收获?
  4. Nature:如何做一篇肠道菌群免疫的顶级文章
  5. seaborn使用boxplot函数可视化箱图并基于分组均值或者中位数进行箱图降序(descending)排序(Sort Boxplots in Descending Order)
  6. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换
  7. pandas计算特征与所有数值特征的相关性并排序可视化:包含pearson、spearman、kendall
  8. R语言使用compareGroups包绘制单因素分析表实战:基于survival包的colon数据集
  9. Python可视化(matplotlib)图像自定义图例(Legend)
  10. R获取股票数据并进行进行可视化分析