反射机制

Java反射Reflect的使用详解

时光怂恿深爱的人放手 提交于 2019-11-27 18:56:38
目录 一. 什么是反射 二. 反射的基础Class 2.1 Class类概述 2.2 Class类对象获取的三种方式 三. 反射-构造函数 3.1 getDeclaredConstructor(Class<?>...parameterTypes) 3.2 getDeclaredConstructors() 四. 反射-成员变量 4.1 getDeclaredField(String name) 4.3 getDeclaredFields() 五. 反射-成员方法 5.1 getDeclaredMethod(String name, Class<?>... parameterTypes) 5.2 getDeclaredMethods() 5.3 方法执行 六. 总结 一. 什么是反射 在运行状态中,对于任意一个类,都能够知道其所有属性和方法,对于任意一个对象,都能够调用其任意方法和属性,这种动态获取信息、动态调用方法的能力称为Java语言的反射机制,大部分框架都有用到反射机制,了解反射的使用方法非常重要。 一个类通常包含了属性、方法、构造函数等,而Java一般情况下是现有类再有对象,通过对象调用各种属性和方法,而Java反射则是通过已有的对象,反过来得到其所属类的相关信息,调用所属类的相关方法。 二. 反射的基础Class 2.1 Class类概述 我们知道在Java的世界中

Java 学习笔记(15)——反射

岁酱吖の 提交于 2019-11-27 18:27:59
Java中的类文件最终会被编译为.class 文件,也就是Java字节码。这个字节码中会存储Java 类的相关信息。在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后使用类加载器将class字节码文件加载到内存,在加载时会调用Class类的 classLoader 方法,读取.class 文件中保存类的成员变量、方法、构造方法,并将这些内容在需要时创建对应的对象。这个就是java中的反射机制。反射机制提供了由字符串到具体类对象的映射,提高了程序的灵活性,在一些框架中大量使用映射,做到根据用户提供的xml配置文件来动态生成并创建类对象 反射机制最关键的就是从字节码文件中加载类信息并封装为对应的结构。在Java中专门提供了一个 Class 类,用于存储从.class 文件中读取出来的类的信息。 该类的定义和常用方法如下: public final class Class<?> extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement{ String getName(); //获取类名 ClassLoader getClassLoader(); //返回类的加载器 static Class<T> forName(String className);

Java反转机制

风格不统一 提交于 2019-11-27 17:04:53
什么是反射: Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。 所谓反射其实就是获取类的字节码文件,也就是.class文件,我们可以通过Class这个对象进行获取。 三种方式获取class对象的方式: 对象.getclass() Iphone iph = new Iphone(); Class clz = iphone.getClass();   2. 类.Class() clz = Iphone.class;   3. Class.forName(“包名.类名”); clz = Class.forName(“com.lalala.Iphone”) 在以上的三种方法中: 方法1,已经创建了Iphone对象,这个时候就不需要去进行反射了,显得有点多此一举; 方法2,需要导入Iphone类的包,依赖性太强了; 方法3中的Class类继承自Object类,故可以直接使用,且实参为字符串,即使com.lalala包中的Iphone类不存在,该方法在不运行时也不会报错,所以我们一般选用方法三! 通过class对象动态创建目标对象: Iphone iph2 = (Iphone)clz.newInstance();//java9之前的方法

Python面向对象:反射(hasattr和getattr和setattr和delattr)

谁都会走 提交于 2019-11-27 16:06:11
一、反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有以下四个内置函数: hasattr:判断一个方法是否存在与这个类中 getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行 setattr:通过setattr将外部的一个函数绑定到实例中 delattr:删除一个实例或者类中的方法 ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' class People: country = 'China' def __init__(self, name): self.name = name def eat(self): print('%s is eating' % self.name) peo1 = People('nick') print(hasattr(peo1, 'eat')) # peo1.eat True print(getattr(peo1, 'eat')) # peo1.eat <bound method People.eat of <__main__.People object at 0x1043b9f98>> print(getattr(peo1, 'xxxxx',

反射

萝らか妹 提交于 2019-11-27 15:20:52
文章目录 1. 反射机制的概念 2. 反射的用处 3. 反射的使用 3.1 获取 Class 对象 3.2 Class 对象的方法 3.3 操作对象 4. 反射的案例 1. 反射机制的概念 将类的各个组成部分封装为对应的数组 ,这就是反射机制。 (如:成员变量数组 Field[] fields,构造方法数组 Constructor[] cons) 2. 反射的用处 可以在程序运行过程中,操作对象。 可以解耦合,提高程序的可拓展性。 3. 反射的使用 3.1 获取 Class 对象 前面我们讲了反射机制就是" 将类的各个组成部分封装为对应的数组 ",而我们要操作这些数组,首先就要获得类对象。 获得类对象的方式有三种: Class.forName(“全类名”):将字节码文件加载进内存,返回 Class 对象。 (多用于配置文件,将类名定义在配置文件中。读取文件,加载类) 类名.class:通过类名的属性 class 获取。 (多用于参数的传递) 对象.getClass():getClass() 方法是在 Object 类中定义的。 (多用于对象的获取字节码的方式) 接下来验证上面的三个对象是否是同一对象 结果是同一对象,于是得出结论: 同一个字节码文件在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 3.2 Class 对象的方法 获取成员变量

反射

吃可爱长大的小学妹 提交于 2019-11-27 14:53:10
为什么需要反射? 需求:我公司定义了一组接口,然后第三方公司按照我公司的接口实现了一套功能,然后交给我们,但是我们公司的项目已经结束,如何实现动态加载第三方公司提供的功能。(类似于热拔插效果) 什么是反射? 反射就是八类中的各种成分映射成各种对象。等同于解刨,可以拿到类中任何成分。 反射常用类: Class:获取类和类的成员信息 Filed:可访问的类的属性 Method:类的方法 Constructor:类的构造方法 使用反射基本步骤: 1.导入java.lang.reflect.* 2.获得需要操作的类的Java.lang.Class对象 3.调用Class的方法获取Field、Method等对象 4.使用反射API进行操作(设置属性﹑调用方法) 获取类对象的方法: 通过对象----person.getClass(); 通过类名----Person.class; 通过Class.forName("xxxx");------Class.forName("xxxxxx"); 获取类的类对象后可以获取类中的属性、构造方法、非构造方法 现获取类对象 : Class<?> clazz = Class.forName("xxxx.xxx.xxPerson"); 【0】动态创建对象 方法一:使用Class的newInstance()方法,仅适用于无参构造方法 Class clazz

C#之反射、元数据详解

懵懂的女人 提交于 2019-11-27 13:07:16
前言   在本节中主要讲述自定义特性、反射和动态编程。自定义特性允许把自定义元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入程序集中。反射是一个普通的术语,它描述了在运行过程中检查和处理程序元素的功能。例如,反射运行完成以下任务: 枚举类型的成员 实例化新对象 执行对象的成员 查找类型的信息 查找程序集的信息 检查应用于某个类型的自定义特性 创建和编译新程序集 这个列表列出了许多功能,本章中主要介绍部分常用的功能。 自定义特性 一、 编写自定义特性   1. 理解自定义特性 [LastModified("Test","Test")] public class TestNumber { }   这个例子首先会发现LastModified 这个特性,首先把字符串 Attribute追加到这个名称后面,形成一个组合LastModifiedAttribute,然后在其搜多路径的所有名称空间去搜索这个名称的类。注意如果本来就以Attribute结尾了,那么也就不会组合在一起了。编译器会找到含有改名称的类,且这个类直接或间接派生自 System . Attribute 。 编译器很认为这个类包含控制特性用法的信息。特别是属性类需要指定: 特性可以应用到那些类型的程序元素上(类、结构、属性和方法等) 是否可以多次应用到同一个应用程序元素上 在应用到类和接口上时

java反射机制以及应用

别来无恙 提交于 2019-11-27 12:58:55
JAVA反射机制+动态运行编译期不存在的JAVA程序 一、有关JAVA反射 在运行期间,在不知道某个类A的内部方法和属性时,能够动态的获取信息、获取类或对象的方法、属性的功能,称之为反射。 1.相关类: (1)Class (2)Method (3)Field 2.相关方法: (1)Class.forName("<完整包名+类名>"); 返回对应的类(同一JVM不管创建该类的多少对象,类只有一个)。 (2)class.getMethod(要获取的方法名,参数类型,参数类型.....);  返回该方法。 (3)执行方法method.invoke(实例,参数,参数.....)  返回该方法的返回值(Object类型,可强转为指定类型)。 (4)class.newInstance()  返回一个实例对象,通常与(3)一起使用。 (5)clazz.getFields()  返回该对象的所有属性。 二、应用 1.简介: 公司有个项目,需要将提交上来的Java源码进行编译与运行,并返回结果。一般的思想是JVM-命令行-JVM的模式。但是这样不但执行速度慢,且获取编译异常、运行异常、运行结果都是非常困难的。所以通过JAVA反射机制,以及自带的编译工具完成功能。 2.代码: import java.io.ByteArrayOutputStream; import java.io.File;

Java反射机制

微笑、不失礼 提交于 2019-11-27 12:39:14
Java反射机制 定义:在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性(包括私有的方法和属性)进行调用。这种动态获取对象信息和调用对象方法的功能称之为反射机制。 反射其实是获取类的字节码文件,也就是.class文件,那么就可以通过Class这个对象进行获取。 反射的四种方式 public static void main(String[] args) { //第一种 ClassName c = new ClassName();//创建一个对象 Class<?> class1 = c.getClass();//获取该对象的Class类 System.out.println(class1.getName());//输出类名称 //第二种 Class<?> class2 = ClassName.class; System.out.println(class2.getName());//输出类名称 //第三种 try { Class<?> class3 = SetUtil.class.getClassLoader().loadClass("com.zxx.util.ClassName"); System.out.println(class3.getName());//输出类名称 } catch

java反射

ε祈祈猫儿з 提交于 2019-11-27 10:35:36
反射机制:    在运行状态中 对于任意一个类,都能够知道这个类的所有的属性和方法 获取class 的三种方式:   1、 Class clazz1 = Class.forName("com.heima.bean.Person");    // Class 的静态方法 通过全类名 获取运行类   2、 Class clazz2 = Person.class;    // 通过.class文件   3、 Person p = new Person(); Class clazz3 = p.getClass();   // Object的getClass()方法 反射如何拿到构造方法: clazz.newInstance() //只能拿空参 Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); //拿有参构造的对象 : 先获取类Class对象 ,然后用getConstructor(参数) public class demon3_reflect { public static void main(String[] args) throws Exception { Class clazz = Class