能够分析类能力的程序称为反射。

  • 检查类的结构(反射机制最重要的内容)
  • 使用反射在运行时分析对象
  • 使用反射编写泛型数组代码
  • 调用任意方法与构造器

动态语言的关键,允许程序在执行期间借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法

因为在编译的时候并没有实例化对象,只有在运行时才能确定

加载完类之后,在堆内存的方法区中就产生了一个 Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。

这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

  • 反射可以做什么?
  1. 在运行时判断一个对象所属的类
  2. 在运行时构造一个类的对象
  3. 在运行时判断一个类所具有的成员变量和方法
  4. 在运行时获取泛型信息
  5. 在运行时调用对象的成员变量和方法
  6. 在运行时处理注解
  7. 生成动态代理

反射源头:Class类,代表某一个运行时类,动态概念 (代表加载到内存中的某一个结构,类、接口、数组、注解···)

//获取Class实例的方式
//1.调用运行时类的属性
Class personClass = Person.class;//2.运行时类的对象
Person person = new Person();
Class personClass1 = person.getClass();//3.调用Class的静态方法,传入类的全类名,带包(常用)
Class forName = Class.forName("xyz.tylt.learn.test.Person");//4.使用类的加载器
ClassLoader classLoader = ATest.class.getClassLoader();
Class loadClass = classLoader.loadClass("xyz.tylt.learn.test.Person");
package xyz.tylt.learn.test;public class Person {private String name;public String password;public Person() {}private Person(String name) {this.name = name;}public Person(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}public void show(){System.out.println("你好呀,我是公开的方法");}private void pshow(){System.out.println("我是私有的方法");}}
Person person = new Person("Tom", "123456");
System.out.println(person);person.show();
//在Person类外部不能通过对象调用其内部私有结构,例如私有构造器与方法
//反射方式
Class<Person> personClass = Person.class;
Constructor<Person> constructor = personClass.getConstructor(String.class, String.class);
//newInstance()创建对应的运行时类对象,依旧是调用类的构造器,一般都用空参,因为带参通用性不强
Person person = constructor.newInstance("Tom", "123456");
System.out.println(person);
       Class personClass = Person.class;
//调用私有构造器Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);declaredConstructor.setAccessible(true);Person person = (Person) declaredConstructor.newInstance("Tom");//调用私有方法Method pshow = personClass.getDeclaredMethod("pshow");pshow.setAccessible(true);pshow.invoke(person);
//调用私有变量Field name = personClass.getDeclaredField("name");name.setAccessible(true);name.set(person, "Jerry");System.out.println(person);

反射(Reflection)相关推荐

  1. C#反射(Reflection)详解

    1. 什么是反射 2. 命名空间与装配件的关系 3. 运行期得到类型信息有什么用 4. 如何使用反射获取类型 5. 如何根据类型来动态创建对象 6. 如何获取方法以及动态调用方法 7. 动态创建委托 ...

  2. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)...

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  3. 反射(reflection)基础

    反射(reflection) 1. 一个需求引出反射 1.1 请看下面的问题 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi 我们用之前的方式处理就是: 先创建一个C ...

  4. JavaSE——第23章 反射reflection

    JavaSE--第23章 反射reflection(老师:韩顺平) 文章目录 JavaSE--第23章 反射reflection(老师:韩顺平) 23.2 反射机制 23.2.1 Java refle ...

  5. Java基础--反射Reflection

    Reflection 反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例. 而在编译期间不用关心对象是谁 反射可用在动态代理,注解解释,和反射工厂等地方. -------- ...

  6. 什么是反射 (Reflection)?可以用它做什么?

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象 ...

  7. Java中的反射(Reflection)为什么叫“反射”?什么是“正射”?如何自定义注解并解析?

    文章目录 反射的定义 什么是"正射" 反射的作用 反射的定义 计算机科学中的反射(reflection) 指计算机程序在运行时(runtime) 可以访问.检测和修改它本身状态或行 ...

  8. java 反射Reflection;Class类

    1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息.类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息. ...

  9. java 反射深度克隆_C#使用反射(Reflection)实现深复制与浅复制

    原文路径:https://blog.csdn.net/qq_28839293/article/details/79487294 1.浅复制: class Program { public static ...

最新文章

  1. jsp的相对路径问题
  2. 查看字符集 oracle
  3. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)
  4. 在vue中怎么写行内样式高_说说在 Vue.js 中如何绑定样式(class 或 style)
  5. C语言函数题-取子串 (10分)
  6. java ueditor 图片上传加水印_Ueditor编辑器上传图片加水印【亲测可用】-帝国CMS整合...
  7. WebApiClient的JsonPatch局部更新
  8. 通俗理解“Schmidt正交化”和“正交矩阵” 此博文包含图片 (2015-05-19 09:50:47) 施密特正交化在空间上是不断建立垂直于原次维空间的新向量的过程。 如图β2垂直于β1(1维)
  9. java零碎要点---struts2中redirect和redirectAction的区别
  10. 信号角度分析评估因子表现(无限资金回测模型)
  11. offset must be non-negative and no greater than buffer length (0)(tensorflow.keras)
  12. 精伦210兼容谷歌_【精伦IDR210身份证阅读器兼容火狐和谷歌浏览器】 - 太平洋安防网...
  13. html代码标签优化与提速,HTML代码标签优化与提速
  14. 摄像头 SONY VISCA 协议
  15. netty的异常分析 IllegalReferenceCountException refCnt: 0, decrement: 1
  16. 跟开涛学shiro练习代码
  17. win10连无线但是无网络连接到服务器,简单几步解决win10连接wifi显示无internet访问的问题...
  18. Jenkins 设置镜像_在k8s上安装Jenkins及常见问题
  19. 失落的嵌入式 英特尔强推MeeGo意欲何为
  20. 要想通过面试,MySQL的Limit子句底层原理你不可不知

热门文章

  1. 掌握这些PDF转Word方法,从此你就是大神的存在
  2. 2021江苏地区高考成绩排名查询,江苏高考成绩排名查询系统,江苏高考位次排名查询...
  3. 项目管理软件之争,禅道和JIRA大对比
  4. 【转】桌面背景文件夹-win7文件夹背景,文件夹背景
  5. access 分组序号_二级Access数据库备考笔记之报表排序和分组
  6. python九九乘法口诀_Python打印出九九乘法口诀
  7. vMotion及Storage vMotion配置
  8. 想要做好软件测评,在这之前这20个小技巧得知道
  9. android新浪微博开发Sso登录
  10. [洛谷]P2404 自然数的拆分问题