当前位置: 首页 > news >正文

java基础反射知识总结_java基础反射知识总结

反射是什么?

在运行状态中,获取一个类的所有属性和方法。这种动态获取信息以及调用对象的方法的功能。

使用反射机制的一些框架?

Retrofit中的注解功能、EventBus,动态生成框架 Gson。

使用反射技术查看类信息

获取Class对象的三种方法

使用Object.getClass方法

如果我们能知道一个对象,可以通过调用这个对象的getClass方法获得一个Class对象。

例如:

Person person = new Person();

Class extends Person> aClass = person.getClass();

System.out.println(aClass.getName());

这时候就会打印这个对象的全包名,aClass中还有其他信息。

使用.class方法

Class extends Person> aClass = Person.class;

System.out.println(aClass.getName());

System.out.println(int.class);

如果没有获取某个类的对象,无法使用getClass方法,可以直接在类名加上.class来获取,这种方式可以用于基本数据类型。

使用Class.forName()方法

这个方法要使用一个类的完整路径,就可以使用Class.forName("类的完整路径")来得到相应的Class。

try {

Class mclass1 = Class.forName("main.fanshe.Person");

System.out.println(mclass1.getName());

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

注意:使用Class的newInstance()方法来创建对应类的实例,需要有默认的构造器,执行newInstance()方法实际上市利用默认构造器来创建该类的实例。

Class mclass1 = Class.forName("main.fanshe.Person");

Object o = mclass1.newInstance();

通过反射获取成员变量

常用获取成员属性的方法

Field[] declaredFields = mclass1.getDeclaredFields();//获取Class对象的所有属性

Field[] fields = mclass1.getFields();//获取class对象的public属性

Field ageField = mclass1.getDeclaredField("age");//获取class指定属性

Field desFiedl = mclass1.getField("name");//获取class指定的public属性

如果获取到属性可以用过set方法进行修改例如:

Field ageField = mclass1.getDeclaredField("age");//获取class指定属性

ageField.setInt(o,22);

如果这个属性是用private修饰的话,这样写的话代码会报错

java.lang.IllegalAccessException: Class main.fanshe.Main can not access a member of class main.fanshe.Person with modifiers "private"

at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)

at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)

at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)

at java.lang.reflect.Field.setInt(Field.java:946)

at main.fanshe.Main.main(Main.java:50)

这时我们要添加 ageField.setAccessible(true);这个方法来声明这个变量是可以访问的就没问题了,但是使用这个方法也可能会导致些其他问题,例如

在运行时虽然你通过反射修改了变量 a 的值,但其他部分可能还在使用原来的值。

通过反射获取成员方法

Method[] methods = mclass1.getDeclaredMethods();//获取class对象的所有声明方法

Method[] allMethods = mclass1.getMethods();//获取class对象的所有public声明方法

Method method = mclass1.getMethod("getAge");//根据方法名返回方法

Method method2 = mclass1.getMethod("getAge",String.class);//根据带指定形参列表的public方法

System.out.println(method.toString());

可以通过method.invoke(o);这个方法调用反射到的方法。

总结

反射还有好多其他方法,可以通过查询API获知,例如获取构造方法等,功能貌似还是比较强大的,但是反射的一些操作可能会引起性能消耗,例如修改某个成员变量的时候,需要引发验证访问权限等额外操作等。所以使用反射的时候也许要考虑下性能方面的问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 是什么让你萌发了跳槽的念头?
  • java汉字如何通过字节传输_java 20 - 8 字节流的文件复制以及汉字在计算机中的存储方式...
  • 《赢在用户》——UI设计的启蒙书
  • XML 路径语言(XPath) 版本 1.0
  • JAVA猜测随机整数_Java程序设计:产生随机数,让用户猜测
  • addslashes php,PHP如何使用addslashes()函数?(代码示例)
  • OWB和ODM的产品信息
  • sumblime text3写php,Sublime Text3及Phpstorm开发工具的代码片段管理
  • 软件技术大会演讲题目敲定:《领域驱动设计在大规模项目中的应用实践》
  • php icouv,PHP_简单谈谈favicon,favicon.ico介绍 favicon.ico是个什 - phpStudy
  • 触发器的简单应用
  • opencart mail.php,opencart联系表单邮件失败的解决办法
  • 创业者应避免的六件事
  • 113 php的位运算符不包括,【后端开辟】PHP的位运算符不包括谁人标记
  • SharpDevelop
  • php的引用
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【刷算法】从上往下打印二叉树
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CAP理论的例子讲解
  • cookie和session
  • create-react-app项目添加less配置
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6系列(二)变量的解构赋值
  • Java精华积累:初学者都应该搞懂的问题
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • vue-router 实现分析
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 半理解系列--Promise的进化史
  • 包装类对象
  • 力扣(LeetCode)22
  • 免费小说阅读小程序
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 新书推荐|Windows黑客编程技术详解
  • 在Unity中实现一个简单的消息管理器
  • 选择阿里云数据库HBase版十大理由
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2.2w字)前端单元测试之Jest详解篇
  • (苍穹外卖)day03菜品管理
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四) Graphivz 颜色选择
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Net core 6.0 升8.0
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET使用存储过程实现对数据库的增删改查
  • @ConfigurationProperties注解对数据的自动封装
  • @property括号内属性讲解
  • @SpringBootApplication 包含的三个注解及其含义
  • @vue/cli脚手架