Reflection的直译。
一个对象,照照镜子:我是谁?(从哪儿来?要到哪儿去?^_^)
程序自己 在 运行时(不是:程序员在读/写代码时),得到自己的:
static void grow(Person person) { //告诉我person是啥?Student,还是Teacher System.out.println(person.getClass().getName()); }
grow(new Student());
并且能根据这些信息构建对象,获取对象数据,调用方法等……
正常的,如果要获得一个对象,必须得用代码new……
用反射,就可以通过一个(字符串格式的)类名,生成一个对象:
Object fg = Class.forName("Teacher").newInstance();
拿到private的成员
注意理解,作为框架开发人员,事先并不知道用户(应用开发人员)会定义什么Controller/ORM实体类/依赖注入的实现类,所以没有什么if...else
简单的说,在编译源代码的时候,编译器就
反射收集的信息并不局限于类型,而是要一直扩展到项目的基本可执行单元:.jar(Java)或者.dll(C#)
这同样是编译器完成的,编译的时候,就创建了一个清单(manifest),把该可执行单元所有的信息列明,反射也依靠该manifest获取相关信息
不用测试,想都想得到,使用反射(这种非常规方式)调用一个方法,和直接new出对象调用方法相比,肯定要慢一些。因为反射本质上就是把编译时做的事情放到了运行时做,编译时可以由编译器进行优化,运行时就不行。
但是,
所以仍然有这么多框架大量的、广泛的使用了反射(当然也进行了性能优化,主要是使用缓存),天没有塌下来!
Java中被称之为注解(annotation);C#中被称之为特性(Attribute)。
使用起来就好像给类/接口/方法/其他类成员等打的(一个或多个)“标签”:Java使用@开头,C#用方括号包裹
比如,标识一个类/方法等已经被废弃
@Deprecated //Java
[Obsolete] //C#
演示:被注解的类/方法能够运行,但是会报警告。
这通常用于需要更改的老旧代码,相较于直接删除或更改,这种方式给了调用者详细的通知,更加的友好,不至于让调用者莫名其妙。
终于可以给大家隆重介绍单元测试利器JUnit了!(C#中对应NUnit)
注意(理解):
演示:eclipse上运行Junit项目
因为测试结果是基于测试数据的,单元测试要求稳定的、不变的测试数据。但是
此外单元测试要求跑得快,因为它应该随时随地的跑。
复习:
使用JUnit,我们可以:
注解/特性还广泛应用于其他框架,比如:
这些我们都在后面继续学习。
多快好省!前端后端,线上线下,名师精讲
更多了解 加: