反射

Class.forName("xxx")调用过程

大兔子大兔子 提交于 2019-12-03 18:50:39
问题: java.lang.ClassNotFoundException 1.Class.forName("xxx")作用概述 xxx:字符串,表示要装载的类名或者是驱动名字。 Class.forName()的主要作用是将“xxx”表示的类装载到JAVA虚拟机中。 2.Class.forName("xxx")具体加载过程 解决的问题: “xxx”表示类的字节码应该放在哪里? Class.forName("xxx")调用过程的相关的类、对象和系统环境? 设计Class.forName("xxx")的意义? 2.1 Class.forName("xxx")寻找过程细节? 这里主要解决前两个问题—— “xxx”表示类的字节码应该放在哪里?和Class.forName("xxx")调用过程的相关的类、对象和系统环境? java.sql.DriverManager.registerDriver(new Driver());【1】 在这篇博文中,表示java.sql.DriverManager是在Class.forName("xxx")中的xxx类放入内存后,才静态注册驱动类。但是JVM如何将xxx放入内存呢?下面是Class类中forName()的源代码 public static Class<?> forName(String className) throws

iOS核心动画笔记6-专用图层

有些话、适合烂在心里 提交于 2019-12-03 16:40:28
专用图层 1. CAShapeLayer CAShapeLayer 是一个通过矢量图形而不是bitmap来绘制的图层子类. 可以指定绘制颜色, 线宽等属性, 用CGPath来定义想要绘制的图形, 最后CAShapeLayer就会自动渲染出来了. 相比使用 CoreAnimation直接在layer上绘制图形, CAShapeLayer有以下优势: 渲染快速. CAShapeLayer使用硬件加速, 绘制同一图形会比用CoreGraphics快很多. 高效使用内存. 一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形, 所以无论有多大, 都不会占用太多的内存. 不会被图形边缘剪切掉. CAShapeLayer可以在边界之外绘制, 图层路径不会像使用CoreGraphics的普通CALayer一样被剪裁掉. 不会出现像素化. 当给CAShapeLayer做3D变换时候, 它不会像一个有寄宿图的普通图层一样变得像素画. 1.1 创建一个CGPath CAShapeLayer上绘制的形状可以通过CGPath来表示, CGPath对象可以直接创建, 更好的是通过UIBezierPath创建CGPath(这种方法不需要手动释放内存, 方便管理). 图层路径不一定是闭合的. 也可以是开放的. 1.2 创建圆角 前面提到创建圆角视图的方法,

Spring的IOC原理[通俗解释一下]

守給你的承諾、 提交于 2019-12-02 18:05:01
本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看。 原文地址: http://blog.csdn.net/m13666368773/article/details/7802126 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。 图2:对象之间复杂的依赖关系 耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间

Spring的IOC原理[通俗解释一下]

会有一股神秘感。 提交于 2019-12-02 18:04:35
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。 图2:对象之间复杂的依赖关系 耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。 为了解决对象之间的耦合度过高的问题 ,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”

GO 反射三法则

放肆的年华 提交于 2019-12-02 11:21:57
引言 在计算过程中,反射是程序检查其自身结构,特别是类型的一种能力。 它是元编程的一种形式,同时也是最容易让人误解的部分。 在本文中,我们试图解释反射在Go中如何工作,以澄清某些事情。每一种语言的反射模型都不同 (甚至许多语言根本不支持反射),不过这篇文章是关于Go的,因此在接下来的内容中, “反射”一词应看做“Go中的反射”。 类型与接口 由于反射建立在类型系统之上,就让我们先来复习一下 Go 中的类型吧。。 Go是静态类型的语言。每个变量都有一种静态类型。换言之,它们都有一种已知的类型, 并且在编译时就确定下来了。比如 int 、 float32 、 *MyType 或 []byte 等等。如果我们定义了 type MyInt int var i int var j MyInt 那么 i 的类型为 int ,而 j 的类型为 MyInt 。尽管变量 i 和 j 拥有相同的底层类型, 但它们的静态类型仍然不同,因此它们在未经转换前是无法相互赋值的。 有一类重要的类型称作接口类型,它表示一个确定的方法集。只要某个具体值 (非接口)实现了某个接口中的方法,该接口类型的变量就能存储它。一个众所周知的例子就是 io.Reader 和 io.Writer ,即 io 包 中的 Reader 和 Writer 类型: // Reader is the interface that wraps

使用泛型和反射技术简化Spring jdbcTemplate的使用

与世无争的帅哥 提交于 2019-12-01 04:56:28
最近没事儿研究了下springMVC,因为不想用hibernate,所以就是用了spring自带的jdbcTemplate。在使用的过程中发现spring jdbcTemplate需要自己实现将结果集转化为对象的操作,个人感觉很是繁琐,于是就使用泛型和反射对这个过程进行了封装,来简化jdbcTemplate的使用。废话少说,上代码: public class MyRowMapper<T> implements RowMapper { private Class<T> cls; public MyRowMapper(Class<T> cls) { this.cls = cls; } @Override public Object mapRow(ResultSet rs, int num) throws SQLException { T t = null; try { // 获取对象中的所有字段 Field[] fields = cls.getDeclaredFields(); // 实例化 t = cls.newInstance(); for(Field f : fields){ // if(f.isAnnotationPresent(NotPersistent.class)){ // continue; // } // 获取字段名称 String fieldName = f

spring ioc容器的原理

你离开我真会死。 提交于 2019-11-30 00:34:43
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。 齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。 图2:对象之间复杂的依赖关系 耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。 为了解决对象之间的耦合度过高的问题 ,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”

如何使用反射来分析PHP的数据结构

陌路散爱 提交于 2019-11-29 06:13:15
更准备的说是 如何用PHP分析类内部的结构。 介绍 当我开始学习PHP编程时,可能并不知道 Reflection API 的强大功能,主要原因是我不需要它来设计我的类,模块甚至是包等等,但是它在很多地方都有非常不错的能力。 下面我们来介绍 Reflection API ,主要是从这几个方面 什么是Reflection API? 安装和配置 使用 总结 什么是 Reflection API Reflection 是计算机程序在运行时检查,修改自己的结构和行为的能力 - 维基百科 这是什么意思呢?让我们来看下面的代码片段: /** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 现在,Profile类是一个使用 ReflectionClass 的黑盒子,你可以获取它里面的内容: // instantiation $reflectionClass = new ReflectionClass('Profile'); // get class name var_dump($reflectionClass->getName()); => output: string(7) "Profile" // get

PHP反射ReflectionClass、ReflectionMethod

大兔子大兔子 提交于 2019-11-28 09:27:47
PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。 其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。 PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。 反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。 平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如: <?php class Person { /** * For the sake of demonstration, we"re setting this private */ private $_allowDynamicAttributes = false; /** *

Go 反射

南笙酒味 提交于 2019-11-27 02:38:22
转载自 赵帅虎的 博客 飞雪无情的 博客 简介 Reflection(反射)在计算机中表示 程序能够检查自身结构的能力,尤其是类型。它是元编程的一种形式,也是最容易让人迷惑的一部分。 本文中,我们将解释Go语言中反射的运作机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。 阅读建议 本文中,我们将解释Go语言中反射的运作机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。 由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。 虽然Go语言没有继承的概念,但为了便于理解,如果一个struct A 实现了 interface B的所有方法时,我们称之为“继承”。 类型和接口 反射建立在类型系统之上,因此我们从类型基础知识说起。 Go是静态类型语言。每个变量都有且只有一个静态类型,在编译时就已经确定。比如 int、float32、*MyType、[]byte。 如果我们做出如下声明: type MyInt int var i int var j MyInt 上面的代码中,变量 i 的类型是 int,j 的类型是 MyInt。 所以,尽管变量 i 和 j 具有共同的底层类型 int,但它们的静态类型并不一样