反射机制

java_反射

左心房为你撑大大i 提交于 2020-02-24 02:14:46
java_反射 什么是反射 概念 放射:将类的各个部分封装为其他对象,这就是反射机制。 java代码在内存中经历的三个阶段 1、 Source 源代码阶段 执行javac编译命令从.java文件到.class文件的过程都是在源代码阶段,.class字节码文件会将类分为多个部分,其中分为成员变量部分,成员方法部分,构造方法部分等。 2、 Class 类对象阶段 通过ClassLoader(类加载器)将字节码文件加载到内存中。 通过Class类对象来描述进入内存中的字节码文件的特征和行为。将成员变量、成员方法、构造方法等封装成单独的对象放入Class类对象中。 最后我们可以通过Class对象的一些行为创建具体的某个对象。 3、 runtime 运行时阶段 new 类(); 反射的好处 在程序的运行期间操作这些对象。 降低程序的耦合性,提高程序的可扩展性。 获取Class类对象的方法 获取class类对象的方式有三种,分别对应的java代码经历的三个阶段 1、 Class.forName("全类名"); 将字节码文件加载进内存,返回class对象 多用于配置文件,将类名定义在配置文件中 2、 类名.class; 通过类名的属性class获取 多用于参数传递 3、 对象.getClass(); getClass()方法是定义在Object类中的 多用于对象获取字节码 同一个字节码文件(*

JAVA 反射机制

*爱你&永不变心* 提交于 2020-02-23 20:06:12
什么是反射? 简言之就是把.class文件转换为java认识的形式,通过反射机制访问类的方法,属性,和构造函数。即 1,反编译:.class-->.java 2.通过反射机制访问java对象的属性,方法,构造方法等; 反射机制适应场景? 创建一个对象可以通过new的形式,但有没有不通过new形式创建对象的呢?答案是反射机制,如jdbc连接数据库使用Class.forname(com.mysql.jdbc.Driver);但new的形式效率更高。因此,反射使用场 景如下: Jdbc 加载驱动----- Spring ioc 框架 反射机制装逼代码,访问类的私有变量 public static void main(String [] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { /* 通过java反射机制访问私有成员 */ //获取当前class类地址 //Class<?> forName=Class.forName("Entity.UserEntity"); // forName Class<?> forName = Class.forName("Entity.UserEntity"); Field useId =

java反射详解

夙愿已清 提交于 2020-02-22 07:26:27
一.概念   反射就是把Java的各种成分映射成相应的Java类。   Class类的构造方法是private,由JVM创建。   反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。 (来自Sun) 二、Java反射机制提供如下功能: 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判段任意一个类所具有的成员变量和方法 在运行时调用任一个对象的方法 在运行时创建新类对象 在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象 1、获取类的Class对象 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有多种方式: 调用getClass Boolean var1 = true; Class<?> classType2 = var1.getClass(); System.out.println(classType2); 输出:class java.lang.Boolean 运用

JAVA打怪之路 - JAVA反射机制

谁说胖子不能爱 提交于 2020-02-19 11:42:13
JAVA反射机制 一、Java反射机制概述( Java Reflection ) 反射相关的主要API: 二、理解Class类并获取Class的实例 ① 理解Class类(描述类的类) 在Object类中定义了以下的方法,此方法将被所有子类继承: ● public final Class getClass() , 以上的方法返回值的类型是一个Class类,此类是Java反射的源头,即:可以通过对象反射求出类的名称。 ② Class类的常用方法 ③ 获取Class类实例的四种方式 ④ 哪些类型可以有Class对象? 三、类的加载与ClassLoader的理解 ① 类的加载过程 ② ClassLoader(类加载器) 类加载器作用是用来把类(class)装载进内存的。JVM 规范定义了如下类型的类的加载器。 ③ 代码示例: //1.获取一个系统类加载器 ClassLoader classloader = ClassLoader.getSystemClassLoader(); System.out.println(classloader); //2.获取系统类加载器的父类加载器,即扩展类加载器 classloader = classloader.getParent(); System.out.println(classloader); //3.获取扩展类加载器的父类加载器,即引导类加载器

Java基础之反射(一)

六眼飞鱼酱① 提交于 2020-02-17 13:37:25
  在Java运行时环境中,对于任意一个类,可以知道这个类的属性和方法,实例化对象,而通过实例化的对象 获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。那么反射可以实现什么功能呢?   1、在运行时判断任意一个对象所属的类。   2、在运行时构造任意一个类的对象。   3、在运行时判断任意一个类所具有的成员变量和方法。   4、在运行时调用任意一个对象的方法。    其中,一般而言,开发者社群说到的动态语言,大致认同的一个定义是:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。"从这个观点看,Perl,Python,Ruby是动态语言,而C++,Java,C#不是动态语言。   Java程序可以加载一个运行时才得知名称的class,获悉其完整构造,并生成其对象实体或对其fields设值或唤起其methods。这种可以"看透class"的能力被称为introspection(内省、内观、反省)。Reflection是Java被视为动态(或者准动态)语言的一个关键性质。    在JDK中,主要由以下类来实现Java反射机制,而这些类都位于java.lang.reflect包中:   Class类:代表一个类,是 Reflection API中的核心类。   Field类:代表类的属性。   Method类:代表类的方法。

Java基础之一反射

不想你离开。 提交于 2020-02-17 13:33:02
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 以上的总结就是什么是反射 反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。 (其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述) 如图是类的正常加载过程:反射的原理在与class对象。 熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。 其中这个Class对象很特殊。我们先了解一下这个Class类 二、查看Class类在java中的api详解(1.7的API) 如何阅读java中的api详见java基础之——String字符串处理 Class 类的实例表示正在运行的 Java 应用程序中的类和接口

22、面向对象(反射)

夙愿已清 提交于 2020-02-17 10:57:41
22.1、反射介绍: 1、什么是反射: (1)反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。 这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向 对象方面取得了成绩。 (2)反射也称作自省,这个性质展示了某对象是如何在运行期取得自身信息的。如果传一个对象给你,你可以查出它有什么能力, 这是一项强大的特性。如果 Python 不支持某种形式的自省功能,dir 和 type 内建函数将很难正常工作。还有那些特殊属性,像 __dict__,__name__,__doc__。 (3)python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射,类本 身也是一个对象); 2、用反射的好处有哪些: (1)实现可插拔机制: 有俩程序员,一个s1,一个是s2,s1在写程序的时候需要用到s2所写的类,但是s2有事请假了,还没有完成他写的类,s1想到了反射, 使用了反射机制s1可以继续完成自己的代码,等s2回来上班后再继续完成类的定义并且去实现s1想要的功能。总之反射的好处就是可以 事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,即你可以事先把主要的逻辑写 好(只定义接口)

Java中的反射机制

前提是你 提交于 2020-02-17 04:22:31
反射:框架设计的灵魂 框架:半成品软件,可以在框架的基础上进行软件开发,简化编码。 反射:将类的各个部分封装为其他对象,这就是反射机制。 反射的好处 1.可以在程序执行过程中,操作这些对象 2.可以降低程序的耦合性,提高程序的可扩展性 获取Class对象的三种方式 1.Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象。 2.类名.class:通过类名的属性class获取 3.对象.getClass:getClass()方法在Object类中定义着 首先在cn . itcast . reflect路径下创建Person类,内有 private String name ; private int age ; 以及各种常规方法 public class ReflectDemo04 { public static void main ( String [ ] args ) throws Exception { //1.Class.forName("全类名"): Class cls1 = Class . forName ( "cn.itcast.domain.Person" ) ; System . out . println ( cls1 ) ; //2.类名.class: Class cls2 = Person . class ; System .

JAVA RTTI

泄露秘密 提交于 2020-02-16 20:34:56
  基础类可接收我们发给派生类的任何消息,因为两者拥有完全一致的接口。我们要做的全部事情就是从派生上溯造型,而且永远不需要回过头来检查对象的准确类型是什么。所有细节都已通过多态性获得了完美的控制。   但经过细致的研究,我们发现扩展接口对于一些特定问题来说是特别有效的方案。可将其称为“类似于”关系,因为扩展后的派生类“类似于”基础类——它们有相同的基础接口——但它增加了一些特性,要求用额外的方法加以实现。如下所示: 尽管这是一种有用和明智的做法,但它也有一个缺点:派生类中对接口扩展的那一部分不可在基础类中使用。所以一旦上溯造型,就不可再调用新方法: 若在此时不进行上溯造型,则不会出现此类问题。但在许多情况下,都需要重新核实对象的准确类型,使自己能访问那个类型的扩展方法。 下溯造型与运行期类型标识:   由于我们在上溯造型期间丢失了具体的类型信息,所以为了获取具体的类型信息——亦即在分级结构中向下移动——我们必须使用 “下溯造型”技术。然而,我们知道一个上溯造型肯定是安全的;基础类不可能再拥有一个比派生类更大的接口。因此,我们通过基础类接口发送的每一条消息都肯定能够接收到。 但在进行下溯造型的时候,我们并不真的知道是什么具体类型。   为解决这个问题,必须有一种办法能够保证下溯造型正确进行。只有这样,我们才不会冒然造型成一种错误的类型。   在某些语言中(如C++),为了进行保证

Python 反射

陌路散爱 提交于 2020-02-16 14:08:39
反射 在做程序开发中,我们常常会遇到这样的需求: 需要执行对象里的某个方法,或需要调用对象的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在 这时我们需要用一个特殊的方法或机制要访问和操作这个未知的方法或变量,这种机制就称之为反射。接下来记录下反射几个的重要方法。 反射的四种方法 hasattr():判断一个对象里是否有对应的字符串方法 getattr():根据字符串去获取obj对象里的对应的方法的内存地址 setattr():给类实例对象动态添加一个新的属性 delattr():给类实例对象动态删除一个已有的属性 # class A: # def __init__(self): # self.a = 10 # # def func1(self): # print('func1') # # def func2(self): # print('func2') # # def func3(self): # print('func3') # a = A() # ret = getattr(a,'ab') # print(ret) # for i in range(10): # res = input('请输入你要访问的地址:') # if hasattr(a,res): 判断输入的字符是否在类中存在 # f = getattr(a,res) # f() # else: #