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); } }

最新文章

  1. 分享一个php邮件库——swiftmailer
  2. CrashMonkey4IOS App测试
  3. 设置 github 帐号user.name和邮箱user.email
  4. codevs2645 Spore
  5. 【整理】深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
  6. js 函数提升和变量提升
  7. 我的web框架
  8. asp.net DropDownList无刷新ajax二级联动实现详细过程
  9. javascript原型链继承
  10. Struct初学的,页面跳转
  11. 《Javascript网页经典特性300例》
  12. Ansible9:条件语句【转】
  13. 【DP系列学习一】简单题:kickstart2017 B.vote
  14. Phonics 自然拼读法 ai, oa,ie, ee,or,j Teacher:Lamb
  15. swagger坑
  16. Spring MVC启动过程(1):ContextLoaderListener初始化
  17. webstorm intelliJ IDEA phpstorm 设置鼠标滚动改变字体大小
  18. 使用MultipartFile上传文件
  19. P4574 [CQOI2013]二进制A+B
  20. HTML+CSS之background

热门文章

  1. django找不到报错 ‘zsh: command not found: django-admin.py’
  2. time | sys | os 模块,递归删除文件,项目分析
  3. 2017 GDCPC 省赛总结
  4. Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
  5. 一个简单的模板了解css+div网页布局
  6. hdu 3943 经典数位dp好题
  7. 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles
  8. POJ 3734_Blocks
  9. 用ReentrantLock和Condition实现生产者和消费者模式
  10. Spring Boot实现多个数据源教程收集(待实践)