反射机制

反射(9)程序集的加载和反射

瘦欲@ 提交于 2020-03-13 14:35:15
一、 程序集的加载 程序集是 .NET Framework 应用程序的构造块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元。 绑定是查找与唯一指定的类型相对应的声明 ( 即实现 ) 的过程。根据此过程是发生在编译时还是运行时分为: a) 静态绑定:在生成时,编译器在程序集清单的元数据中记录静态引用。 b) 动态绑定:由于调用各种方法而动态构造的, EG : Assembly.Load 方法。 程序集如何加载请 参见下面链接: 1、 《(5)CLR 运行时探测程序集引用的步骤》 2、 《(6)程序集加载上下文》 3、 《(7)动态程序集加载Load()》 二、 程序集的反射 字段、构造器、方法、属性、事件和嵌套类型都可以被定义成一个类型的成员。 FCL(Framework Class Library— 框架类库 ) 定义了一个抽象基类 MemberInfo ,封装了一组所有类型成员都通用的属性。 对“动态绑定”的程序集进行成员绑定的规则可通过 Binder 类重写,作为搜索成员方法的参数传入;如果此参数传 null ,则使用默认绑定规则进行成员绑定同“静态绑定”。 1. 区分 DeclaringType 和 ReflectedType a) ReflectedType 获取用于获取 MemberInfo 的此实例的类对象。 返回的类对象总是执行反射的

python基础之类的isinstance与issubclass、反射

有些话、适合烂在心里 提交于 2020-03-13 05:47:27
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass obj = Foo() print(isinstance(obj,Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo: pass class Bar(Foo): pass print(issubclass(Bar,Foo)) 二 反射 1、什么是反射 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。 2、python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 基于对象级别的反射 基于类级别的反射 基于模块级别的反射 四个可以实现自省的函数: def hasattr(*args, **kwargs): # real signature unknown """ Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass

MyBatis 源码分析-项目总览

筅森魡賤 提交于 2020-03-12 02:43:33
MyBatis 源码分析-项目总览 1.概述 本文主要大致介绍一下MyBatis的项目结构。 引用参考资料《MyBatis技术内幕》 此外, https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰到一些问题,可以参考一下。 2.模块划分 MyBatis在项目模块划分还是很清晰的。各个模块层次以及具体作用,如下: 模块 层次 定义 session 接口层 提供给外部使用的接口API scripting 核心处理层 解析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。 mapping 核心处理层 映射 builder 核心处理层 配置解析 executor 核心处理层 执行器模块,串联整个执行流程。 plugin 核心处理层 插件模块:提供插件接口,通过自定义插件方式对MyBatis进行拓展 cursor 核心处理层 游标模块 reflection 基础支持层 反射模块:mybatis专门对反射模块进行封装。提供更加简单易用的API type 基础支持层 类型转换模块:Mybatis为简化配置提供了别名机制。提供java类型与JDBC类型转换 logging 基础支持层 日志模块:主要是集成第三方日志 io 基础支持层 资源加载模块:对类加载器进行了封装。确定类加载器顺序

反射与动态代理的关系

陌路散爱 提交于 2020-03-12 02:29:56
先展示下mybatis的动态代理是怎样的 结合上一篇文章实践的 String resource = "mybatis.xml" ; InputStream resourceAsStream = Resources . getResourceAsStream ( resource ) ; SqlSessionFactory factory = new SqlSessionFactoryBuilder ( ) . build ( resourceAsStream ) ; SqlSession sqlSession = factory . openSession ( ) ; // 不使用动态代理的情况下 try { List < User > userList = sqlSession . selectList ( "com.wyl.mybatis.dao.UserDao.getUserList" ) ; System . out . println ( "**********" + JSON . toJSON ( userList ) ) ; } finally { sqlSession . close ( ) ; } // 使用动态代理的情况下 try { UserDao userDao = sqlSession . getMapper ( UserDao . class ) ;

Java反射之构造方法反射

☆樱花仙子☆ 提交于 2020-03-11 13:10:38
上一篇 Java反射之Class类 我们介绍了java反射的关键类Class, 反射就是由一个java类映射得到一个java类 。 所以,我们自然能想到,一个类中应该有哪些属性,这里做个比方,人有名字年龄等属性,所有一个Person类中就会有name,age这两个属性,同理,一个类中也有构造方法,字段,方法等属性。 接下来我们首先了解构造方法,通过反射构造方法动态创建一个对象。 [一] Constructor类 Constructor对象代表的是一个构造方法,那么这个对象应该有哪些方法呢,我们猜测一定会有获得这个构造方法的名称,获得该构造方法属于的类,通过这个构造方法产生一个对象等方法。 从jdk文档里可以看到有getName()获得构造方法名称,getDeclaringClass()获得所属类的类,newInstance()创建对象。 在开发中,我们常用Constructor类的newInstance()方法来动态创建对象。 [二] 获得Constructor对象 在演示Constructor类中的方法前,先介绍如何获得Constructor,和Class一样,Constructor也不可以直接new出。 上面是Class类的jdk文档中的两个方法,这两个方法分别是获得指定的构造方法和获得所有的构造方法。 所以我们知道,想要得到Constructor对象,就要先获得Class对象

深入学习JAVA注解-Annotation(学习过程)

邮差的信 提交于 2020-03-11 10:08:18
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题。记录此学习过程。 项目中遇到的注解: //使用注解的地方 @ServiceScan({"com.sinosoft.lis.pubfun"}) public class CodeQuerySQL {} //注解类 ServiceScan @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ServiceScan { String[] value() default {}; } //这个com.sinosoft.lis.pubfun包下的类 @CodeQuery public interface CodeQuery_Framework {} //注解类CodeQuery @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface CodeQuery { } 问题描述: 开发中,我们需要自己新建一个codequeryframework_nb类,这个类是这样使用的,放在com

Java反射常用API汇总

China☆狼群 提交于 2020-03-11 04:28:06
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性” 一、类对象的获取 1.通过对象获取 Object obj = new Object(); obj.getClass(); 2.通过类名获取 Object.class; 3.通过类的路径名获取 Class.forName("com.metadata.Student"); 二、类的实例化和构造函数 获取到的class对象可以直接通过clazz.newInstance()方法实例化,但是需要目标类有默认无参构造函数,不然会抛出异常。 在类没有默认无参构造函数,或者需要某个具体的构造函数来实例化的情况,需要通过Constructor类的newInstance()来完成。 1.获取公有构造函数,不包括父类 //Classpublic Constructor<?>[] getConstructors() public Constructor<T> getConstructor(Class<?>... parameterTypes) 2.获取 当前类 构造函数,忽略修饰符 //Class public Constructor<?>[] getDeclaredConstructors() public Constructor<T>

【C#】反射机制

佐手、 提交于 2020-03-11 04:00:06
.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行操作 可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样 反射机制通常有下面一些用途 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。 使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。 使用

java反射知识

只愿长相守 提交于 2020-03-10 16:21:50
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 动态的获取类中的信息,就是java反射 java反射的作用示意图(可以对已经定义的代码利用配置文件进行扩展,不用修改源代码,源文件提供了接口,开发者可以编写实现接口的类,类中存在处理请求和应答方式,再进行配置,即可达到原程序的扩展,) package reflect.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import useclass.Person; public class reflectDemo { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException,

重学JAVA基础(二):Java反射

元气小坏坏 提交于 2020-03-10 11:30:59
看一下百度的解释: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息 以及动态调用对象的方法的功能称为java语言的反射机制。 先看一下一个例子: 这是最简单的反射使用方法,通过反射来调用类的方法。 下面通过一个需求来做反射实验:有3种人类(黄,白,黑),分别继承于Human类,都有人类的共同操作Behaviour /** * 行为,区别于动物 * @author tomsnail * @date 2015年4月1日 上午10:10:42 */ public interface Behaviour{ public void eat(); public void sleep(); public void think(); public void sport(); public void work(); } import java.util.Random; /** * 皮肤类型 * @author tomsnail * @date 2015年4月1日 上午11:41:33 */ public enum SkinType{ yellow,white,black; public static SkinType getSkinType(){ int r = new Random()