反射

概念

反射指的是程序可以访问、检测和修改它本身状态或行为的一种能力。反射可以将类的各个组成部分分装为其他对象。

理解

框架

框架是半成品的软件,可以在框架的基础上进行软件开发,简化编码,而反射是框架的灵魂。

  • Java在计算机中经历的阶段:三个阶段

    • source源代码阶段
    • class类对象阶段
    • 运行时阶段
  • class类:class类对象由成员变量(Field)、成员方法(Method)和构造方法(Constructor)等部分构成

  • 获取class类对象方式

    • class.forName(“全类名”):将字节码文件加载进内存,返回class对象。全类名要包括包名、类名。

      • 该方法多用于配置文件,将类名定义在配置文件中,读取文件,加载类,框架中常用的方式。
    • 通过类名.class( )方式来获取对象,这时文件已经加载到内存中了
      • 多用于参数的传递
    • 对象名.getClass方法:getClass方法在object类中定义。
      • 多用于对象的获取字节码的方式。
    • 重点:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取class类对象都是同一个。但获取其他方法对象、变量对象则不是同一个。
  • class对象功能:

    • 获取成员变量们

    •   /*获取class类对象的三种方式*/Class cls = Class.forName("com.huiyan.bohui.test.Person");System.out.println(Person.class);Person person = new Person();System.out.println(person.getClass());/*只获取public修饰的成员变量*/Field[] fields  = cls.getFields();for (Field fields1:fields) {/*获取成员变量的值*/Object value =fields1.get(person);System.out.println(value);}/*只获取特定名字的public修饰的成员变量,如果获取的不是public修饰的成员变量,会报错,表示不存在该成员变量*/Field fld = cls.getField("gender");/*修改成员变量的值*/fld.set(person,"女");/*获取全部的成员变量*/Field[] fields1  = cls.getDeclaredFields();/*修改成员变量私有变量的修改需要设置一个值* 为了忽略访问权限修饰符的安全检查。需要对象调用这个 getAccessible(true),就可以访问private修饰的对象了。下面这个是private修饰的成员变量。如果不设置getAccessible的值为true,则会报错。报错信息如下Exception in thread "main" java.lang.IllegalAccessException: Class com.huiyan.bohui.reflect.Reflect1 can not access a member of class com.huiyan.bohui.test.Person with modifiers "private"* */Field fieldDeclare1 = cls.getDeclaredField("name");fieldDeclare1.setAccessible(true);Object valueDeclare1 = fieldDeclare1.get(person);System.out.println(valueDeclare1);
      
    • 获取构造方法们

    • 构造方法有一个创建对象的方法
      constructor.newInstance();
      如果是使用空参构造器创建对象,直接使用class类对象的new instance方法。
      类对象.newInstance():获取到了类对象。
      获取私有构造器也可以使用暴力反射,设置setAccessible为true。
      
    • 获取成员方法们和获取类名

    • Object invoke(Object obj, Object... args)  方法
      /*获取指定名称的方法对象*/
      Person p = new Person();
      Method method = cls.getMethod("eat");
      Method method1 = cls.getMethod("eat",String.class);
      /*执行方法*/
      method.invoke(p);
      method1.invoke(p,"饭");/*获取方法名或者全类名*/
      String name = method.getName();
      String className = personClass.getName;
  • 案例:写一个“框架”,可以帮我们创建任意类的对象,并且执行其中任意方法。

  • public class ReflectTest {/*这个是框架,可以帮我们创建任意类的对象,并操作类的方法。
    *   1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中2.在程序中加载读取配置文件3.使用反射技术来加载类文件进内场4.创建对象5.操作对象* */public static void main(String[] args) throws Exception {//加载配置文件,创建properties对象Properties pro = new Properties();/*加载配置文件,转换为一个集合,先获取类加载器,使用类加载器获取class目录下的配置文件字节流,然后使用properties对象的load方法加载*/ClassLoader classLoader = ReflectTest.class.getClassLoader();InputStream is =classLoader.getResourceAsStream("pro.properties");pro.load(is);//获取配置文件中定义的数据String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//加载该类进内存Class cls = Class.forName(className);//创建对象Object obj = cls.newInstance();//获取和操作方法Method method1 = cls.getMethod(methodName);/*invoke方法返回值为null*/method1.invoke(obj);}
    }
    

    总结
    1.获取类对象的三种方法
    (1)class.forname(“全类名”)
    (2)类名.class();
    (3)对象名.getClass();
    2.获取一个类的对象的方法
    (1)new关键字直接创建
    (2)获取类对象,使用newInstance()方法。
    (3)通过clone方法创建一个对象。
    (4)通过反序列化的方式创建一个对象。
    3.获取类的Field/Method/Constructor对象
    (1)有四种常用方法:getField/getField("")/getDeclaredField()/getDeclardField()
    后面的method和constructor对象的获取方法类似。
    前两种方法获取public修饰的成员变量/成员方法/构造器,后两种可以获取任意的成员变量/成员方法/构造器。后两种访问私有变量/成员方法/构造器时都要设置setAccessble为true,采用暴力的方式让系统忽略访问权限修饰符的安全检查。获取或设置变量用get方法和set方法,执行Method方法用invork(),还可以传参数。获取构造方法后可以用来创建类的对象。
    4.获取方法名和全类名的方法:getClass()

反射是什么?反射的常用方法相关推荐

  1. 一篇文章弄懂Java反射基础和反射的应用场景

    文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...

  2. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  3. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  4. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  5. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在执行反射方法时 , 反射方法后 , 直接调用该方法 ; // 获取 View 的 getListenerInfo 方法 Method getLis ...

  7. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  8. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  9. java 反射 速度_Java 反射获取类方法速率和实现方式

    今天突然想到Java反射.然后测试了一下1.8.0_191版本的反射性能,没想到反射竟然比直接调用性能还高. 反射介绍 Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法.对于任何一 ...

  10. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

最新文章

  1. 收藏版超全机器学习资料合集
  2. shell-sed命令详解(转)
  3. 用Silverlight做广告Banner
  4. ros轮式小车学习链接
  5. redis源码剖析(八)—— 当你启动Redis的时候,Redis做了什么
  6. 初学者python笔记(装饰器后篇:登陆验证)
  7. pthread_join来接收线程的返回参数
  8. 谭晓生大闹中国计算机中心,360高管谭晓生不满中国计算机大会拖堂和临时加议程,现场摔话筒发飙...
  9. 【BAT】中文数字to阿拉伯数字转换
  10. iOS 使用ZipArchive压缩文件
  11. web 服务器有哪些
  12. 利用red5搭建一个简单的流媒体直播系统(ubuntu 12.10)
  13. win10小娜助手无法搜索本地应用怎么办
  14. TCP协议和UDP协议头部结构
  15. 【前端微服务化】使用飞冰搭建前端微服务化框架
  16. spyder pyecharts不显示_逆袭的IGZO-IPS小金刚!微星PAG272QRZ显示器评测:色域、响应速度更优秀...
  17. Fragment中getContext得到的context从哪来?
  18. 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析
  19. 解决“此图片来自微信公众平台 未经允许不可引用”的方法
  20. 我的理想计算机作文300字,我的理想作文300字(通用5篇)

热门文章

  1. 基于lucene的案例开发:纵横小说数据库操作
  2. 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
  3. 冷酷小叶的Java学习笔记Day6
  4. MySQL完全卸载,mysql服务清理
  5. 下载最新的Windows10官方系统镜像
  6. 创业板“市盈率” PE ratio
  7. 手把手系列--验证自己编写的STM32H750XBH6_ArtPi平台Keil MDK Flash下载算法
  8. 兄弟连IT教育-九年的发展!
  9. 织梦友情链接加nofollow方法,亲测
  10. newmultipartentity php,使用MultipartEntity图片上传