1. 反射机制的由来

RTTI 机制可以告知某个对象的确切类型,但有一个前提,该类型在编译时必须已知(编译器在编译时打开和检查 .class 文件以获取类型信息)。似乎是个很宽松的限制,但假如你获取了一个指向并不在你的程序空间的对象的引用,也即编译期间无法获知该对象所属的类,等到程序真正运行起来时,才有可能。比如,在网络连接中获取了一串(事先不被预知)的字节,并被告知这些字节代表着一个类。然而该类在为你的程序生成代码之后很久才出现,那么如何在编写代码时,使用这样的类呢?

  • RTTI 与 反射的区别:

    • RTTI 需要在编译时打开和检查 .class 文件
    • 对于反射机制,.class 文件在编译时是无法获取的,所以是在运行时打开和检查 .class 文件

2. reflect 类库

Class 类库与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了如下三种类(每个类均实现了 Member 接口(interface Member)):

  • Field:成员变量;
  • Method:成员函数;
  • Constructor:构造器;

Java 的反射机制能获取未知类的全部成员,包括构造函数。

3. 一个实例

  • Car 类:

    package reflect;public class Car {private String brand;private String color;private int maxSpeed;public Car() {}public Car(String brand, String color, int maxSpeed) {this.brand = brand;this.color = color;this.maxSpeed = maxSpeed;}// getters, setters 方法
    }

    为了体现 java 反射机制的威力,我们不采用直接 new 的方式(有时候,比如远程过程调用 RPC,我们无法确切地知道其构造函数的参数列表)

  • ReflectTest

    package reflect;import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;public class ReflectTest {public static Car initByDefaultConst() throws Throwable{ClassLoader loader = Thread.currentThread().getContextClassLoader();Class<?> clazz = loader.loadClass("reflect.Car");Constructor<?> cons = clazz.getDeclaredConstructor((Class[])null);Car car = (Car)cons.newInstance();Method setBrand = clazz.getMethod("setBrand", String.class);setBrand.invoke(car, "红旗CA72");Method setColor = clazz.getMethod("setColor", String.class);setColor.invoke(car, "黑色");Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class);setMaxSpeed.invoke(car, 100);return car;}public static void main(String[] args) throws Throwable {Car car = initByDefaultConst();System.out.println(car);}}

Java 反射 —— 运行时的类型信息相关推荐

  1. Class类 和 class对象(运行时的类型信息)

    什么是类?可以理解为.class文件 某种意义上来说,java有两种对象:实例对象和Class对象.每个类的运行时的类型信息就是用Class对象表示的.它包含了与类有关的信息.其实我们的实例对象就通过 ...

  2. java中编译类型的方法 和 运行时的类型方法 有什么区别

    1:引言 这是在复习多态当中,看到不太理解的东西, 就是 Java编译类型和运行类型 2:多态 多态首先得是在 有继承关系和方法重写的类当中:指同一个方法在被调用时,由于对象不同则会有不同的效果(). ...

  3. 如何获取注解中的值_如何在运行时利用注解信息

    注解( annontation )是 Java 1.5 之后引入的一个为程序添加元数据的功能.注解本身并不是魔法,只是在代码里添加了描述代码自身的信息,至于如何理解和使用这些信息,则需要专门的解析代码 ...

  4. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

  5. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  6. 运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例

    运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例 一.理解RTTI 先看看官方文档:http://docwiki.emb ...

  7. java多态编译,java多态 运行时多态和编译时多态

    java多态 运行时多态和编译时多态 我们知道java的多态是一个重要的特性,其中体现java的多态有两种形式.运行时的多态和编译时的多态. 编译时的多态会发生在方法重载的时候,方法的重载指方法名相同 ...

  8. 基于 Java 2 运行时安全模型的线程协作--转

    在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...

  9. Java对象运行时在内存中的情况

    Java对象运行时在内存中的情况 您可能已经知道,一旦创建了一个对象,它就只是堆中的一系列字节.您可能对Java对象在内存中的情况感到好奇吗? 1.变量 以下是"Base"(B)类 ...

最新文章

  1. 智能家居市场的魔方法则深度剖析
  2. java 导出csv_数据集标注方法、R数据的导出_R
  3. 微信小程序----日期时间选择器(自定义精确到分秒或时段)
  4. PHP的CURL报错的排查记录:短连接的成本真的很高啊
  5. python白名单验证-Python中XSS白名单过滤的实现
  6. hdu1174(3维射线与圆是否相交)
  7. AU R-CNN:利用专家先验知识进行表情运动单元检测的R-CNN模型
  8. A Brief History of NoSQL (转)
  9. 丹麦为NSA开绿灯 通过通信中心监控欧洲政客
  10. C++的就业前景怎么样?
  11. selenium定位php,selenium之元素定位
  12. 利用正则表达式限制网页表单里的文本框输入内容
  13. ISO9001:2000标准的主要特点和要求(转载)
  14. 免费而强大的十款PCB设计软件
  15. UIPath 获取网页元素做遍历点击的实现
  16. AlexNet 实现猫狗分类(keras and pytorch)
  17. python都学什么啊-那些效率高的人都在偷偷学什么?
  18. CF1647F Madoka and Laziness
  19. -1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常...
  20. 平面设计中字体设计的重要性是什么

热门文章

  1. 去掉图片黑背景输出为透明png(算法和工具)
  2. websocket 带头部信息请求 header_BeetleX之Websocket协议分析详解
  3. linux 网络对讲,基于ARM与Linux的全数字化可视对讲系统的设计与实现
  4. java: Internal error in the mapping processor: java.lang.NullPointerException问题解决
  5. hive 中String对长度没有限制
  6. 重新配对_Apple Watch配对失败的解决办法
  7. 扩展-视图 View
  8. java consumer.poll_java – 无法在kafka consumer下设置’max.poll.records’,其中cons.poll仍然返回分区下的所有记录...
  9. python 写一个计算器_Python | 写个计算器吧
  10. 第八届蓝桥杯第五题取数位