反射机制

Java中的反射

試著忘記壹切 提交于 2019-12-18 01:55:47
Java中的反射 概述 Java的反射是一个非常重要的概念。它具体是指,在运行状态中,对于任意一个类,我们都能够知道这个类的所有的方法和属性;对于任意一个对象,我们都能够调用它的任意一个属性或方法;这是一种动态的获取信息以及动态的操作对象的机制。使用反射可以访问类的私有对象,但是这并不是反射的目的,反射的目的是能够使程序在运行时对类进行自观,在开发某些功能时非常有用。实际上,反射的效率远比直接代码的性能差得多。 Reflection API简介 Class类:一个类 Field类:类的成员变量 Method类:类的方法 Constructor类:类的构造方法 Array类:提供了动态创建数组,以及访问数组的元素的静态方法 Class的三种获取方式 利用对象的getClass()方法; 利用Class类的静态方法forName(); 使用.class属性; 来源: CSDN 作者: GaleZhang 链接: https://blog.csdn.net/GaleZhang/article/details/103587445

Java反射机制(二)—— 深入JDK了解反射(JDK1.8)

…衆ロ難τιáo~ 提交于 2019-12-17 21:15:48
在 《Java反射机制(一)—— 使用反射》 一文中我们提到,在类的初始化阶段会创建对应类的一个Class对象,Class对象里还缓存了该类的所有Constructor对象、Method对象、Filed对象。这个初始化阶段是在JDK底层以C语言实现的,有兴趣可以自行查看。本文只对反射机制是如何使用Class对象实现实例创建、方法调用、属性访问进行说明。 1.反射创建对象的过程 1.1反射获取Constructor对象的过程 反射创建一个类的对象是从获取该类的Constructor(构造器)对象开始的。Class对象获取特定构造函数对象的方法是getDeclaredConstructor(Class<?>… parameterTypes) 。 JDK源码 /*Class*/ @CallerSensitive public Constructor < T > getDeclaredConstructor ( Class < ? > . . . parameterTypes ) throws NoSuchMethodException , SecurityException { checkMemberAccess ( Member . DECLARED , Reflection . getCallerClass ( ) , true ) ; return getConstructor0

java 反射机制

杀马特。学长 韩版系。学妹 提交于 2019-12-17 15:09:49
  JAVA反射机制是在 运行状态中 ,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 注意:反射是在 运行的时候 进行的,不是在编译的时候运行的。 反射的功能 Java反射机制 主要 提供了以下 功能 : 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法;生成动态代理。 API简介 在这里先看一下 sun 为我们提供了那些反射机制中的类:   — java.lang.Class; 代表一个类   — java.lang.reflect.Constructor; 代表类的构造方法   — java.lang.reflect.Field; 代表类的成员变量(成员变量也称为类的属性)   — java.lang.reflect.Method;  代表类的方法   — java.lang.reflect.Array;  提供了动态创建数组,以及访问数组的元素的静态方法 注意:java中无论生成某个类的多少对象, 这些对象都会对应于同一个Class对象。 方法介绍 方法关键字 含义 getDeclaredMethods () 获取所有的方法

虚幻4属性系统(反射)翻译

泄露秘密 提交于 2019-12-17 12:30:55
反射是程序在运行时进行自检的一种能力。它非常有用且在虚幻引擎中基础技术,支撑了诸如 编辑器中的细节面板、序列化、垃圾回收、网络复制、以及蓝图与C++交互等功能。然而,C++原生并不支持任意形式的反射,因此 虚幻引擎有它自己的系统用来 利用、查询以及操作关于C++类、结构体、函数 、成员变量以及枚举的信息。我们特意把反射叫做属性系统,因为反射也是一个图形术语。 反射系统是可以选择加入的。你需要给暴露给反射系统的类型或属性添加注解,这样Unreal Header Tool (UHT)就会在编译工程的时候利用那些信息生成特定的代码。 标记 为了标记一个头文件包含反射类型,需要在文件顶部添加一个特殊的include文件。这让UHT知道它需要考虑这个文件,并且在反射系统的实现里也是需要的。 #include "FileName.generated.h" 你现在可以使用UENUM()、UCLASS()、USTRUCT()、UFUNCTION()、以及UPROPERTY()来在头文件中注解不同的类型以及成员变量。每一个宏都会出现在类型或者成员变量的前面,并且可以包含额外的修饰符关键字。让我们来看一个真实的例子(从StrategyGame截取一部分): /////////////////////////////////////////////////////////////////////////

类加载器、反射

杀马特。学长 韩版系。学妹 提交于 2019-12-17 10:32:26
第1章 类加载器 当你的文件编译的时候会产生class文件,当运行文件的时候class文件会被加载到方法与数据共享区,这个时候,当一进入方法与数据共享区的时候会由 类的加载器 负责在堆里面创建一个对象(字节码文件对象) New的是和这个不一样的,new可以new很多个,但是字节码文件对象我们控制不了,是又累的加载器创建的( 只创建一个 ) 静态同步方法中的锁对象是 类名.class ,因为他优先于静态 1.1 类的加载 l 加载 就是指将class文件读入内存,并为之创建一个Class对象。( 文件字节码 ) 任何类被使用时系统都会建立一个Class对象 l 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值(静态初始化) 解析 将类的二进制数据中的符号引用替换为直接引用( int a=1/a是符号引用,1是直接引用 ) l 初始化 就是我们以前讲过的初始化步骤 1.2 类初始化时机 1. 创建类的实例( new一个类的对象的时候 ) 2. 类的静态变量,或者为静态变量赋值( 访问某个类的静态变量或者给他赋值的时候 ) 这个时候Demo01进内存,Math也进内存,并且创建字节码文件对象( 访问静态 ) 3. 类的静态方法( 只要用到类的静态变量就进内存 ) 4. 使用反射方式来强制创建某个类或接口对应的java.lang

Java反射机制中常用的类

邮差的信 提交于 2019-12-17 10:28:02
Java反射机制中常用的类 (1)Class类:用于保存运行时信息的类,可以创建想要代表类的对象 1-1创建Class类的三种方法: ①使用Class类内部定义的一个static方法取得Class类对象(主要使用)Class.forName(“com.aprsource.reflect.demo.Cat”); ②使用”类.class”取得Cat.class ③通过Object类的getClass()方法即通过指定对象取得Cat cat = new Cat();cat.getClass() 1-2通过指定对象来获取类的信息 ①获取类访问修饰符信息:classx.getModifiers() ②获取包名信息:classx.getPackage().getName() ③获取类名信息:classx.getName() 1-3通过Class对象获取构造方法 ①获取所有的public修饰的构造方法classx.getConstructors() ②获取所有的的构造方法classx.getDeclaredConstructors() ③获取指定public修饰的构造方法classx.getConstructor(构造方法的参数类型信息) ④获取指定任意的构造方法classx.getDeclaredConstructor(构造方法的参数类型信息) 1-4通过Class对象获取普通方法

反射机制

自古美人都是妖i 提交于 2019-12-16 20:14:47
反射机制 下面我们一起来探讨一下java的反射机制吧!功能太强大了,哈哈! (一). 定义    Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 1.1 主要功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法 生成动态代理 1.2 应用范围   在web应用中不是很多,但反射机制是如今很多流行框架的实现基础,包括Spring、Hibernate等。 1.3 注意    Java通过Reflection API来完成反射机制,在java.lang.reflect包中有Field、Method、Constructor三个类分别用于描述类的属性、方法、构造方法。 1.4 Constructor类    Constructor类用于 表示类的构造方法 ,通过调用Class对象的 getConstructor() 方法就能获取当前类的构造方法的集合。 1.4.1 Constructor类的方法   String getName()————返回构造方法的名称   Class[] getParameterTypes()————返回当前构造方法的参数类型   int

类加载器与反射

自作多情 提交于 2019-12-16 18:11:15
类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将class文件读入内存,并为之创建一个Class对象。 任何类被使用时系统都会建立一个Class对象 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 初始化 就是我们以前讲过的初始化步骤 类初始化时机 1. 创建类的实例 2. 类的静态变量,或者为静态变量赋值 3. 类的静态方法 4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 5. 初始化某个类的子类 6. 直接使用java.exe命令来运行某个主类 类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象。 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行 类加载器的组成 Bootstrap ClassLoader 根类加载器 也被称为引导类加载器,负责Java核心类的加载 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 Extension ClassLoader 扩展类加载器 负责JRE的扩展目录中jar包的加载。 在JDK中JRE的lib目录下ext目录 System

深入理解 Java 反射和动态代理

不想你离开。 提交于 2019-12-16 16:39:50
📓 本文已归档到:「 javacore 」 🔁 本文中的示例代码已归档到:「 javacore 」 1. 简介 1.1. 什么是反射 反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 通过反射机制,可以在运行时访问 Java 对象的属性,方法,构造方法等。 1.2. 反射的应用场景 反射的主要应用场景有: 开发通用框架 - 反射最重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过 XML 文件配置 JavaBean、Filter 等),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。 动态代理 - 在切面编程(AOP)中,需要拦截特定的方法,通常,会选择动态代理方式。这时,就需要反射技术来实现了。 注解 - 注解本身仅仅是起到标记作用,它需要利用反射机制,根据注解标记去调用注解解释器,执行行为。如果没有反射机制,注解并不比注释更有用。 可扩展性功能 - 应用程序可以通过使用完全限定名称创建可扩展性对象实例来使用外部的用户定义类。 1.3. 反射的缺点 性能开销 - 由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此

Java反射详解.class getClass() Class.forname

戏子无情 提交于 2019-12-16 13:26:49
反射:框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。 获取Class对象的方式: Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 类名.class:通过类名的属性class获取 多用于参数的传递 对象.getClass():getClass()方法在Object类中定义着。 多用于对象的获取字节码的方式 结论: 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 Class对象功能: 获取功能: 获取成员变量们 Field[] getFields() :获取所有public修饰的成员变量 Field getField(String name) 获取指定名称的 public修饰的成员变量 Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符 Field getDeclaredField(String name) 获取构造方法们 Constructor<?>[] getConstructors() Constructor