首页 > 编程知识 正文

通俗理解java反射(java反射机制原理)

时间:2023-05-03 14:12:04 阅读:68114 作者:4494

相反,反射概述JAVA反射机制在运行状态下可以知道任何类的该类的所有属性和方法; 对于任何对象,都可以调用其方法和属性之一。 这种动态检索的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要解剖类,必须首先获取该类的字节码文件对象。 解剖时使用Class类的方法。 首先,获取与每个字节码文件对应的Class类型的对象。

以上总结是什么是反射

反射是将java类的各种组件映射到单个java对象

例如,一个类具有成员变量、方法、构造方法、包等信息,利用反射技术可以解析一个类并将各个组件映射到一个对象上。 (实际上,一个类中包含这些成员方法、生成方法和参与类中的一个类。)

图是类的正常加载过程。 反射的原理在class对象中。

熟悉加载时: Class对象的来源是将Class文件导入内存并为其创建Class对象。

二、Java为什么需要反射? 反射解决什么问题? Java有两种编译类型:

静态编译:编译时确定类型后,绑定对象将通过。动态编译:在运行时确定类型并绑定对象。 动态编译可以最大限度地发挥Java的灵活性,体现多态性的应用,降低类之间的耦合性。Java反射是Java被视为动态(或准动态)语言的一个关键性质该机制允许程序在运行时通过Reflection APIs获取已知名称的class的内部信息。 其中包括修改(如modifiers、public和static )、实现的接口(如superclass和Object )和Cloneable

在编译期间,Reflection可以在运行时加载、探测和使用完全未知的类。 也就是说,Java程序可以在运行时加载第一个知道名称的类,获取其完整结构,生成目标实体,为其fields设置值,或调用methods。

reflection允许静态语言在运行时检查和修改程序的结构和行为。

在静态语言中,在使用变量时,必须知道其类型。 在Java中,变量的类型信息在编译时保存在class文件中,并在运行时保证准确性。 也就是说,程序运行时的动作是固定的。 如果想在运行时进行变更,则需要反射这一点。

实现Java反射机制的所有类都位于java.lang.reflect包中。

Class类:表示类的Field类。 表示类的成员变量(类的属性) Method类(方法Constructor类)表示类的构造方法Array类)数组动态创建并访问数组元素的静态方法330

三.使用

1、获取Class对象的三种方法

1.1对象—— getclass (;

1.2所有数据类型(包括基本数据类型)都具有“静态”class属性

1.3类Class静态方法: forname (字符串类名称) () (常用) ) ) )。

/* *获取class对象的三种方法* 1 Object —— getClass (; * 2所有数据类型(包括基本数据类型)都具有“静态”class属性。 * 3通过Class类的静态方法: forname (字符串类名称) )常规(*/publicclassfanshe ) publicstaticvoider //此new是Student对象和cccd Class stuClass=stu1.getClass (; 获取Class对象system.out.println (stu class.getname ); //第二种方法获取Class对象Class stuClass2=Student.class; system.out.println (stu class==stu class2);//使用第一种方法获取的Class对象和使用第二种方法获取的Class对象是否相同//使用第三种方法获取Class对象try { classtuclass3=class.forname (' ffname ) //请注意,此字符串必须是实际路径。 具有包名称的类路径。 包名称.类名system.out.println (stu class3==stu class2);//判断三种方式是否获取了相同的Class对象(catch ) classnotfoundexceptione ) {e.printStackTrace ); } system.out.println (' * * * * * * * * * * * *公共,获取无参与的结构方法**************** ) ) ) ) ) //1,因为是无参数的构造函数,所以类型为空。 不用写。 这里需要的是参数的类型。 请不要忘记类型//2,返回描述没有此参数的构造函数的类对象。 获取system.out.println('********公共字段**,* * * * * * * * * * * * ); fieldf=stuclass.getfield('name ); 系统. out.println (f; system.out.println (' * * * * * * * * * * *私人show4) ) (************* ) ) ) ) ) ) system.out.println(m; m .设置可访问(true; //取消私人限定objectresult=m.invoke(obj,20 ); //需要两个参数:要调用的对象(获取具有反射的对象)和引用System.out.println )返回值: ' result。 }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。