java反射(reflect)

java反射(reflect)

两个重要的认识

  • 编译期间: 程序员在.java文件中写好的代码,然后编译成.class文件,在编程的时候由程序员指定的类与类之间的继承关系
    类的方法和属性是在程序员编程时确定好的,jvm拿着这个程序就可以直接运行.
  • 运行期间: 程序员在写程序时,对于类中的方法和属性,并没有指定具体的调用方式和属性值,方法的调用,和属性的赋值是
    在程序运行期间,由jvm动态指定的方法的调用方式,和属性值

什么是反射

  • 反射是运行期间的多态它能够
    • 运行期间 动态获取类中的所有信息(属性 构造 方法)
    • 运行期间动态创建对象
    • 运行期间动态调用方法
    • 运行期间动态访问属性
    • 运行期间动态解析注解
  • 这种在运行期间动态获取类中的信息(属性,方法,构造,注解),以及动态调用方法和属性的功能称为java的反射机制通俗的理解就是在运行期间动态的访问类

如何使用反射

一个重要的认识
  • 一个特殊的类 Class
    • 每一个加载完成的类,都会在堆中出现一个Class类型的对象,并且只有一个,这个对象储存在堆中,引用在栈中,然后程序员就可以获取这个对象,然后操作类中对应的属性
  • 获取这个对象的方法
    • Class clazz = 对象.getClass
    • Class clazz = 类名.class
    • Class clazz = Class.forName(包名.类名)
  • 这个对象中包含什么
    • 此对象所对应的类中的所有的属性
    • 此对象所对应的类中的所有的方法
    • 此对象所对应的类中的所有的注解
    • 此对象所对应的类中的所有的构造
Class对象中的信息
  • 可以获取类的属性,属性的修饰符,属性的名字,属性的类型
  • 可以获取类中的方法,方法的修饰符,方法的返回值类型,方法的名字,方法的参数列表
  • 可以获取类中的构造函数,构造的修饰符,构造的参数列表
  • 可以获取类中的注解 注解的名字,注解的属性值
结论,有了反射对象可以动态的获取类中的信息,可以由程序员在运行期间动态的指定方法的调用方式,以及属性值,但是获取Class对象的代码是在编译期间写好的,以及调用方法和指定属性的原则也是在编译期间指定的,然后有jvm在运行期间动态的调用方法和指定属性,(注意:反射会获得类中私有的属性和方法,极其不安全)

反射的一些api

  • 用反射的方式创建对象
    • Class对象.newInstance();
    • Class对象.getConstructor(new Class[ ]{ “参数的Class对象” String.class}).newInstance(“参数列表”)
  • 使用反射的方式获取类中的属性,以及指定属性的值
    • 获取当前类以及长辈类中的公有的属性
      • Filed[ ] fileds = Class对象.getFileds();
    • 获取当前类中的所有属性
      • Field[] fields = Class对象.getDeclaredFields();
    • 获取当前类及长辈类中指定的公有属性
      • Field field = Class对象.getField(String fieldName);
    • 获取当前类中指定的属性
      • Filed field = Class对象.getDeclaredField(String fieldName);
    • 通过反射设定属性的值
      • Field对象.set(Object obj,Object value);
      • 如果Field是私有的
      • 必须先执行:Field对象.setAccessable(true);//设置属性可以访问
    • 通过反射动态获取属性的值
      • Object value = Field对象.get(Object obj);
      • 如果Field是私有的
      • 必须先执行:Field对象.setAccessable(true);//设置属性可以访问
  • 用反射的方式获取方法的信息
    • 获取当前的类以及长辈类的公有方法
      • Method[] method = Class对象.getMethods()
    • 获取当前类中的所有的方法
      • Method[] method = Class对象.getDeclaredMethods();
    • 获取当前类以及长辈类中的指定的公有的方法
      • Method method = Class对象.getMethod(String methodname,new Class[]{methodname的参数类型});
    • 获取当前类中的指定的方法
      • Method method = Class对象.getDeclaredMethod(String MethodName ,new Class []{方法的属性})
    • 通同过反射动态调用指定的Method
      • Object returnValue = Method对象.invoke(Object obj,Object…args)
      • 解析:
        • 就是通过obj这个对象调用Method对象确定的方法,给这个方法传递
        • args参数,Method对象对应的方法的返回值是returnValue
反射的优点:
  • 大幅度的提高开发效率,框架就是用反射实现的,框架提高了开发效率
反射的缺点:
  • 反射的方法的执行效率,比非反射的执行效率低
  • 反射可以暴露类中的所有细节,突破封装
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值