问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅析java中的反射机制

发布网友 发布时间:2024-09-26 02:58

我来回答

1个回答

热心网友 时间:2024-09-27 18:41

什么是反射

反射机制指的是程序在运行时能够获取自身的信息即在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。反射是Java的特征之一,是一种间接操作目标对象的机制。

反射的基础之class

Class类是反射实现的基础,要想理解反射,首先要理解Class类。在程序运行期间,虚拟机为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类的完整结构信息,包括包名、类名、实现的接口、拥有的方法和字段等。可以通过特殊的Java类访问这些信息,这个类就是Clas类。可以把Class类理解为类的类型,一个Class对象,称为类的类型对象,一个Class对象对应一个加载到JVM中的一个.class文件。

publicfinalclassClass<T>implementsjava.io.Serializable,GenericDeclaration,Type,AnnotatedElement{privatestaticfinalintANNOTATION=0x00002000;privatestaticfinalintENUM=0x00004000;privatestaticfinalintSYNTHETIC=0x00001000;privatestaticnativevoidregisterNatives();static{registerNatives();}...}

首先JVM会将代码编译成一个.class字节码文件,然后被类加载器(ClassLoader)加载进JVM的内存中,同时会创建一个类的Class对象存到堆中(注意这个不是new出来的对象,而是类的类型对象)。JVM在创建类对象前,会先检查其类是否加载,寻找类对应的Class对象,若加载好,则为其分配内存,然后再进行初始化。

在加载完一个类后,堆内存的方法区就产生了一个Class对象,这个对象就包含了完整的类的结构信息,通过这个Class对象可以看到类的结构,就好比一面镜子。所以称之为:反射。

反射的基本使用

反射机制的常用的类

Java.lang.Class;

Java.lang.reflect.Constructor;

Java.lang.reflect.Field;

Java.lang.reflect.Method;

Java.lang.reflect.Modifier;

反射常用的API

对象.setAccessible(true);

Class:

获取公开属性:getField("属性名");

获取私有属性:getDeclaredField("属性名");

通过指定方法名称获取公开无参方法对象:getMethod("方法名",null);

获取所有公开方法对象:getMethods();

获取所有方法对象:getDeclaredMethods();

通过指定方法名称获取私有有参方法对象:getDeclaredMethod("方法名",方法参数的类型......);

调用公开有参构造:getConstructor(构造参数类型);

调用私有有参构造:getDeclaredConstructor(构造参数类型);

判断是否是某个类的实例:isInstance(obj);

Field:

获取属性名:getName();

获取属性的类型:getType();

获取属性的修饰符:getModifiers();

设置属性值1:类实例化对象要设置的参数值:set(obj,obj);

Method:

方法对象.invoke(类实例化对象,方法的参数数组);//执行方法

Constructor:

NewInstance();//通过构造获取到类的实例对象

下面看代码:

publicclassTest(){Aa=newA();Classc1=A.class;//任何一个类都有一个隐含的静态成员变量classClassc2=a.getClass();//在已知类的对象的情况下通过getClass方法获取Classc3=null;try{c3=Class.forName("com.xxxx.A");//类的全称}catch(ClassNotFoundExceptione){e.printStackTrace();}}classA{}方法的反射:getName

getName方法可以打印出类类型的类名称。

publicclassTest2{publicstaticvoidmain(String[]args){Classc1=String.class;//String类的类类型Classc2=void.class;System.out.println(c1.getName());System.out.println(c2.getName());}}成员变量反射publicclassTestUtil{publicstaticvoidprintFieldMessage(Objectobj){Classc=obj.getClass();//Field[]fs=c.getFields();}

getFields()方法获取的所有的public的成员变量的信息。和方法的反射那里public的成员变量,也有一个获取所有自己声明的成员变量的信息:Field[]fs=c.getDeclaredFields(),然后遍历得到的结果如下:

for(Fieldfield:fs){//得到成员变量的类型的类类型ClassfieldType=field.getType();StringtypeName=fieldType.getName();//得到成员变量的名称StringfieldName=field.getName();System.out.println(typeName+""+fieldName);}构造函数的反射publicstaticvoidTest(Objectobj){Classc=obj.getClass();/**java.lang.Constructor中封装了构造函数的信息,它有两个方法:*getConstructors()方法获取所有的public的构造函数*getDeclaredConstructors()方法得到所有的自己声明的构造函数*///Constructor[]cs=c.getConstructors();Constructor[]cs=c.getDeclaredConstructors();for(Constructorconstructor:cs){System.out.print(constructor.getName()+"(");//获取构造函数的参数列表->参数列表的类类型Class[]paramTypes=constructor.getParameterTypes();for(Classclass1:paramTypes){System.out.print(class1.getName()+",");}System.out.println(")");}}总结

反射在实际编程中应用并不多,但是很多设计都与反射机制有关,比如:动态代理机制,JDBC连接数据库,Spring/Hibernate框架(实际上是因为使用了动态代理,所以才和反射机制有关)。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 0与任何数相加都得原数吗? 机器设备日常维修支出为什么不计入管理费用而计入制造费用 让yin mao 增黑增多快速生长的方法 请问快速永久tuomao的简便方法?真心感谢! 10v增压到12v电路.本人有一220v—10v变压器想得到输出12v的电路... Mr Li wants me to join the swimming club.为什么want要加s? 新买的车被划到了,怎么办才好啊? 新车有划痕可以抛光吗划痕抛光能抛掉吗 车身有轻微划伤,自己可以处理吗? ...被环境保护部命名为国家生态市,标志着太仓市生态建设已取得阶段性的... 江苏哪个城市养老最好? 我是邮储银行金卡用户为什么在我不知情的情况下,扣我3元短信费?_百度... 原材料明细科目写什么 原材料科目包含什么 原材料具体包含什么 月季用什么花盆好 月季需要什么样的花盆 月季小苗适合什么花盆 柿子一天最多吃几个呢 一天最多能吃几个柿子 柿子一天多可以吃几个 WORD分栏均匀分两栏可是却全部分到了左边右边一个字都没有为什么会这样... ...使用“开始”选项卡下“编辑”功能区的“清除”命令不可以用来... 在Excel中,执行"编辑→清除"菜单命令,不能实现 在excel中,右击某单元格,在弹出的快捷菜单中选择删除命令,不可能完成的... 广州蓝令企业管理咨询有限公司业务范围 企业内训机构哪家专业? 慧宇讲师团慧宇讲师团简介 广州市奥锐管理顾问有限公司公司介绍 广州企业拓展培训机构哪家好呢? 广州云想信息科技有限公司启业决胜培训 广州光环企业管理咨询有限公司简介 广州经华纬业企业管理有限公司经纬专业服务 墨鱼的功效与作用是什么? 石蜐的功效与价值有哪些? 为什么开宝马的人素质那么低下?请看详细说明,很生气,每天中午晚上都被吵... 小米手机不见了怎么定位找回 小米手机不见了怎么定位找回来 唐氏筛查看男女表格 什么是唐氏筛查 泗洪离南京有多远路程 使用IDA调试SO脱壳,环境准备及各步骤原理详解 如何使用IDA Pro编辑ios中的dylib 系统分析师属于什么行业 系统分析师是什么行业