反射机制

Java反射:框架设计的灵魂

て烟熏妆下的殇ゞ 提交于 2019-12-27 20:23:37
Java反射:框架设计的灵魂 框架:办成品软件,可以在框架的基础上进行开发 反射:将类的各个部分封装成对象,这就是反射机制 反射的好处 在程序运行的过程中,操作这些对象 可以降低程序的耦合性,提高程序的可扩展性 获取class对象的方式 Class.forName(“全类名”):经字节码文件加载进内存,返回class对象 多用于配置文件,将类名定义在配置文件中,读取文件,加载类 类名.class:通过类名的属性class获取 多用于参数传递 对象.getClass():getClass()方法在Object方法中定义 多用于对象的获取字节码的方式 同一个字节码文件(*.class)在一次程序运行过程中,只被加载一次 不论通过哪一种方式获取的Class文件都是同一个 package reflect ; import domain . Person ; public class ReflectPerson { public static void main ( String [ ] args ) throws Exception { //Class.forName("全类名") Class cls1 = Class . forName ( "domain.Person" ) ; System . out . println ( cls1 ) ; //类名.class Class

java 反射原理

依然范特西╮ 提交于 2019-12-27 18:09:15
反射 设计背景 反射是为了能够动态的加载一个类,动态的调用一个方法,动态的访问一个属性等动态要求而设计的。它的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下得API以达到各种动态需求。反射的初衷不是方便你去创建一个对象,而是让你在写代码的时候可以更加灵活,降低耦合,提高代码的自适应能力。 机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有 在运行时调用任意一个对象的方法 生成动态代理 组成 由于反射最终也必须有类参与,因此反射的组成一般有下面几个方面组成: java.lang.Class.java:类对象 java.lang.reflect.Constructor.java:类的构造器对象 java.lang.reflect.Method.java:类的方法对象 java.lang.reflect.Field.java:类的属性对象 加载过程 根据虚拟机的工作原理,一般情况下,类需要经过:加载->验证->准备->解析-

通过反射来写一个批量插入的工具类

ε祈祈猫儿з 提交于 2019-12-27 17:20:56
背景:项目中会有很多地方用到批量插入,如果数据量大的话需要通过分批的形式来批量插入,但师不同的表会调用不同的dao的方法,而分批插入的代码又是相似的,每次都要写一边这个相似的代码,势必会造成代码的冗余,所以需要把分批插入的部分封装成一个共同的方法来调用,我想到的是通过反射机制,代码如下。 1.interface public interface CommonService { /** * 分批批量插入 * * @param obj 实例对象 * @param methodName 方法名 * @param list 方法的参数 * @return */ <T> int batchInsert(Object obj, String methodName, List<T> list); } 2.实现class @Service("commonService") public class CommonServiceImpl implements CommonService { @Override public <T> int batchInsert(Object obj, String methodName, List<T> list) { if (list == null || list.size() == 0) { return 0; } try { // 获取类 Class<?

iOS反射机制:objc_property_t的使用

故事扮演 提交于 2019-12-27 10:58:12
#import <objc/runtime.h> 需要导入这个头文件。 动态获取一个自定义类对象中的所有属性 - (NSDictionary *)allProperties { NSMutableDictionary *props = [NSMutableDictionary dictionary]; unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); for (i = 0; i<outCount; i++) { objc_property_t property = properties[i]; const char *char_f =property_getName(property); NSString *propertyName = [NSString stringWithUTF8String:char_f]; id propertyValue = [self valueForKey:(NSString *)propertyName]; if (propertyValue) [props setObject:propertyValue forKey:propertyName]; } free(properties);

C#反射之一(Assembly.Load及Assembly.Load.CreateInstance方法介绍)

僤鯓⒐⒋嵵緔 提交于 2019-12-27 05:28:05
最近研究设计模式,在学习 Terrylee老师的 AbstractFactory的时候用到了反射,顺便也研究了一下C#的反射机制。收集了网上的一些资料和我个人的理解,供大家学习 在 C# 中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系 : System.Reflection 命名空间 (1) AppDomain: 应用程序域,可以将其理解为一组程序集的逻辑容器 (2) Assembly: 程序集类 (3) Module: 模块类 (4) Type: 使用反射得到类型信息的最核心的类 他们之间是一种从属关系,也就是说,一个 AppDomain 可以包含 N 个 Assembly, 一个 Assembly 可以包含 N 个 Module, 而一个 Module 可以包含 N 个 Type. AppDomain 这个类我们等下再来讲解。我们先关注 Assembly 个类, 在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是 Load,LoadFrom 和 LoadWithPartialName 三个 Assembly 的静态方法 . 先来讲解 Assembly.Load 方法,该方法会有多个重载版本,其中一个就是提供程序集的 详细 信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记 , 全部都是以一个字符串的形式提供,例如 :

C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍

一个人想着一个人 提交于 2019-12-27 05:27:32
最近研究 设计 模式,在 学习 Terrylee老师的 AbstractFactory的时候用到了反射,顺便也研究了一下C#的反射机制。收集了网上的一些资料和我个人的理解,供大家学习 在 C# 中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系 : System.Reflection 命名空间 (1) AppDomain: 应用程序域,可以将其理解为一组程序集的逻辑容器 (2) Assembly: 程序集类 (3) Module: 模块类 (4) Type: 使用反射得到类型信息的最核心的类 他们之间是一种从属关系,也就是说,一个 AppDomain 可以包含 N 个 Assembly, 一个 Assembly 可以包含 N 个 Module, 而一个 Module 可以包含 N 个 Type. AppDomain 这个类我们等下再来讲解。我们先关注 Assembly 个类, 在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是 Load,LoadFrom 和 LoadWithPartialName 三个 Assembly 的静态方法 . 先来讲解 Assembly.Load 方法,该方法会有多个重载版本,其中一个就是提供程序集的 详细 信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记 , 全部都是以一个字符串的形式提供,例如 :

C#反射区别(Assembly.Load及Assembly.Load.CreateInstance)

点点圈 提交于 2019-12-27 05:27:02
在设计模式, 用到了反射,顺便也研究了一下C#的反射机制。收集了网上的一些资料和我个人的理解,供大家学习 在 C# 中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系 : System.Reflection 命名空间 (1) AppDomain: 应用程序域,可以将其理解为一组程序集的逻辑容器 (2) Assembly: 程序集类 (3) Module: 模块类 (4) Type: 使用反射得到类型信息的最核心的类 他们之间是一种从属关系,也就是说,一个 AppDomain 可以包含 N 个 Assembly, 一个 Assembly 可以包含 N 个 Module, 而一个 Module 可以包含 N 个 Type. AppDomain 这个类我们等下再来讲解。我们先关注 Assembly 个类, 在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是 Load,LoadFrom 和 LoadWithPartialName 三个 Assembly 的静态方法 . 先来讲解 Assembly.Load 方法,该方法会有多个重载版本,其中一个就是提供程序集的 详细 信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记 , 全部都是以一个字符串的形式提供,例如 :"MyAssembly,Version=1.0.0.0, culture=zh

Java的反射机制之反向抽烟

我只是一个虾纸丫 提交于 2019-12-27 01:09:38
show me the code and take to me,做的出来更要说的明白 GitHub项目 JavaHouse 同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 反射是一种不按套路处出牌的机制。通常我们接触的方式都是 "正射",暂且起这个名字。虽然我们用的少,但是反射其实就在我们日常开发中。比如我们常见的空指针异常,或者是 Spring 的各种注解配置创建对象等等。 正常操作 ReflectTest reflectTest = new ReflectTest(); reflectTest.setName("boolenbl公众号"); System.out.println(reflectTest.getName()); 一般我们使用上面方法创建对象以及初始化属性。并且有严格的访问规则。但是反射就反其道为之。他利用 Class、 Method、 Field等类,随意创建对象,获取公有、私有的方法,获取私有的、共有的方法。 Class 类 Class 类只有私有的构造方法,因此我们不能初始化该对对象,不过 Class 类也不是给我们使用的。 Class 类只能被 JVM 调用。有图有真相: 获取Class 类 有三种方法可以获取到 Class 类。代码如下: // 方法1 System.out.println(ReflectTest.class); // 方法2

Java反射实现动态加载

拟墨画扇 提交于 2019-12-27 00:40:18
延迟加载,动态应该就体现在运行时,而不是编译时的。 //首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params); public java.util.List act(String content,String content2,java.util.List params); } // 下面依次是两个实现类 import java.util.*; public class Success implements Operator{ public static void main(String[] args) { List list = new ArrayList(); list.add("Success3"); Operator op = new Success(); System.out.println("act===" + op.act("Success1", "Success2", list)); } //实现接口的方法 // public java.util.List act(java.util.List params) public java.util.List act(String content, String content2,java

Golang基础(5):Go语言反射规则

寵の児 提交于 2019-12-27 00:29:19
Go语言反射规则 - The Laws of Reflection 转: http://my.oschina.net/qbit/blog/213720 原文地址: http://blog.golang.org/laws-of-reflection 介绍 反射在计算机的概念里是指一段程序审查自身结构的能力,主要通过类型进行审查。它是元编程的一种形式,同样也是引起混乱的重大来源。 在这篇文章里我们试图阐明Go语言中的反射是如何工作的。每种语言的反射模型是不同的(许多语言不支持反射),然而本文只与Go有关,所以我们接下来所提到的“反射”都是指Go语言中的反射。 类型与接口 由于反射是建立在类型系统(type system)上的,所以我们先来复习一下Go语言中的类型。 Go是一门静态类型的语言。每个变量都有一个静态类型,类型在编译的时后被知晓并确定了下来。 ? 1 2 3 4 type MyInt int var i int var j MyInt 变量 i 的类型是 int ,变量 j 的类型是 MyInt 。虽然它们有着相同的基本类型,但静态类型却不一样,在没有类型转换的情况下,它们之间无法互相赋值。 接口是一个重要的类型,它意味着一个确定的的方法集合。一个接口变量可以存储任何实现了接口的方法的具体值(除了接口本身)。一个著名的例子就是 io.Reader 和 io.Writer :