反射机制

反射的优缺点

霸气de小男生 提交于 2020-03-28 07:18:46
优点:反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类; 缺点:1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。 2、使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。 至于执行效率的话,还可以,因为它是一种 强类型 语言,执行效率不错。不过,建议将反射过后,保存进 cache中。 来源: https://www.cnblogs.com/lihuiwang/p/3478562.html

C# 反射(Reflection)

主宰稳场 提交于 2020-03-28 07:18:03
C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 优缺点 优点: 1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高自适应能力。 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。 缺点: 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。 反射(Reflection)的用途 反射(Reflection)有下列用途: 它允许在运行时查看属性(attribute)信息。 它允许审查集合中的各种类型,以及实例化这些类型。 它允许延迟绑定的方法和属性(property)。 它允许在运行时创建新类型,然后使用这些类型执行一些任务。 查看元数据 我们已经在上面的章节中提到过,使用反射(Reflection)可以查看属性(attribute)信息。

c# 反射

混江龙づ霸主 提交于 2020-03-28 07:17:45
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 1、优缺点 优点: 1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高自适应能力。 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。 缺点: 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。 2、反射(Reflection)的用途 反射(Reflection)有下列用途: 它允许在运行时查看特性(attribute)信息。 它允许审查集合中的各种类型,以及实例化这些类型。 它允许延迟绑定的方法和属性(property)。 它允许在运行时创建新类型,然后使用这些类型执行一些任务。 来源: https://www.cnblogs.com/sayshap/p/7638906.html

面试:说说Java反射中获取Class对象三种方式的区别?

◇◆丶佛笑我妖孽 提交于 2020-03-27 08:19:55
在上篇文章《一篇文章全面了解Java反射机制》中我们学习了Java反射机制的基本使用,留心的朋友可能已经注意到了,在文中提到了三种获取Class对象的方法。 如果面试中涉及到Java反射,那么遇到该面试题的概率将大大增加。 以下三种获取Class对象的方式有什么不同? 1、new Object().getClass 2、Object.class 3、 Class.forName("java.util.String") 本篇文章就通过实例带大家来了解一下这三种获取Class对象的区别。示例基于JDK8。 实例演示场景一 为了更好的演示,我们先创建一个对象Person,对象内部定义了一些静态的方法。 public class Person { static { System.out.println("Person:静态代码块"); } { System.out.println("Person:动态代码块"); } public Person(){ System.out.println("Person:构造方法"); } } 在Person对象中分别定义了:静态代码块、动态代码块、构造方法。 针对上面的实例,我们构建了三个单元测试的场景,对应代码如下: public class GetClassTest { @Test public void test1(){ Class<?> clz

Python-反射机制

早过忘川 提交于 2020-03-26 23:49:03
一、python-反射机制   目录     1、反射基本方法     2、反射demo 二、   1、hasattr(obj,name_str) #判断一个对象obj里是否有对应的字符串的方法    getattr(obj,name_str) # 根据字符串去获取obj对象里的对应的内存地址, 字符串是 变量则返回值   setattr(obj,'y','z') #根据字符串设置属性(方法,变量)   delattr(obj,name_str) 删除 2、demo class Dog(object): def __init__(self,name): self.name=name def eat(self,food): print('%s 开始吃'%self.name,food) def bulk(self): print('1233 %s' %self.name) d=Dog('李富贵') chaer=input('输入:').strip() if hasattr(d,chaer): #func=getattr(d,chaer) #func('包子') setattr(d,chaer,'雷') #修改原来变量的内容 print(getattr(d, chaer)) delattr(d,chaer) #删除 print(d.name) else: setattr(d,chaer

Java 反射相关整理

╄→гoц情女王★ 提交于 2020-03-26 19:04:42
1. Class 类 Class 是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等。 对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。 Class 对象只能由系统建立对象,一个类(而不是一个对象)在 Java 虚拟机中只会有一个 Class 实例。 Class 对象的由来是将 class 文件读入内存,并为之创建一个 Class 对象。 获取 Class 类对象的三种方法 使用 Class.forName 静态方法,当知道类的全路径名时,可以使用该方法获取 Class 类对象。 Class clz = Class.forName("java.lang.String"); 使用 .class 方法,这种方法适合在编译前就知道操作的 Class。 Class clz = String.class; 使用类对象的 getClass() 方法。 String str = new String("Hello"); Class clz = str.getClass(); Class 类的常用方法 方法名 功能说明 static Class forName(String name) 返回指定类名 name 的 Class 对象。 Object newInstance() 调用缺省构造函数,返回该

JAVA反射原理

馋奶兔 提交于 2020-03-25 12:18:02
什么是反射? 反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。java反射使得我们可以在程序运行时动态加载一个类,动态获取类的基本信息和定义的方法,构造函数,域等。除了检阅类信息外,还可以动态创建类的实例,执行类实例的方法,获取类实例的域值。反射使java这种静态语言有了动态的特性。 类的加载 java反射机制是围绕Class类展开的,在深入java反射原理之前,需要对类加载机制有一个大致的了解。jvm使用ClassLoader将字节码文件(class文件)加载到方法区内存中: Class clazz = ClassLoader.getSystemClassLoader().loadClass("com.mypackage.MyClass"); 可见ClassLoader根据类的完全限定名加载类并返回了一个Class对象,而java反射的所有起源都是从这个class类开始的。 ReflectionData 为了提高反射的性能,缓存显然是必须的。class类内部有一个useCaches静态变量来标记是否使用缓存,这个值可以通过外部配置项sun.reflect.noCaches进行开关。class类内部提供了一个ReflectionData内部类用来存放反射数据的缓存,并声明了一个reflectionData域,由于稍后进行按需延迟加载并缓存

java的反射

白昼怎懂夜的黑 提交于 2020-03-22 23:09:48
反射 是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的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

C#反射

大城市里の小女人 提交于 2020-03-20 18:26:34
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。 应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。 程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。 (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private

C#反射的特性

南笙酒味 提交于 2020-03-20 06:53:21
如果您现在对反射还不太了解的话,那么可以先看看这篇博文,来粗略的了解一下反射吧。 什么是反射   反射特性(Attribute)   1. C#内置特性介绍   特性是一个对象,它可以加载到程序集及程序集的对象中,这些对象包括 程序集本身、模块、类、接口、结构、构造函数、方法、方法参数等,加载了特性的对象称作特性的目标。特性是为程序添加元数据(描述数据的数据)的一种机制,通过它可以给编译器提供指示或者提供对数据的说明。 注意:特性的英文名称叫做Attribute,在有的书中,将它翻译为“属性”;另一些书中,将它翻译为“特性”;由于通常我们将含有get和/或set访问器的类成员称为“属性”(英文Property),所以本文中我将使用“特性”这个名词,以区分“属性”(Property)。 上面这个提示是在VS中的,大家在编程的过程中应该有遇到过的。 下面我们就引入第一个特性 1.1 System.ObsoleteAttribute 特性 我们通过如图示这个例子来看一下特性是如何解决上面的问题:我们可以给旧的SendMsg()方法上面加上Obsolete特性来告诉编译器这个方法已经过时,然后当编译器发现当程序中有地方在使用这个用Obsolete标记过的方法时,就会给出一个警告信息。 namespace TestObsolete { class Program { public class