
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。c++ java但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
我的理解:
?????????? ??说到这个机制先要理解一下加载。加载可以分为动态加载和静态加载,所谓静态加载就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。也就是在还没有生成class文件之前就能发现程序中的错误,例如ide编译器中还没点build之前就下面有波浪线报错提示,像打错了一些参数或者格式不对。
?????????? ??动态加载就是在运行时的加载,那么静态加载和动态加载有什么不同呢?举个例子,我们在编程序的时候是不是一定要全部调对程序才可以生成字节码文件再运行呢。比如你写了两个语句,第一个没错,但是第二个有问题,静态加载的时候你就过不了,生成不了字节码文件,也就无法执行第一个语句。c++ java那么动态加载就相当于绕过了这个过程,直接生成字节码文件,然后再运行出错时停止,也就是会执行第一个语句,运行到第二个语句时才会抛异常,这是不是就方便调试了呢。
?????????? ??还有一个很重要的用途,就是当一个项目很大的时候,不可能把全部程序写好再生成字节码文件再运行吧,效率太低,而且每个人都有分工,如果只是静态加载就相当于会发生“一锅老鼠屎毁了一锅粥”的感觉。这个时候就需要动态加载了,还有就是当对工程代码进行修改时,静态加载需要重新生成class文件才能运行,但是动态加载就没必要这么做,这就大大提高了效率。
?????????? ?? 那么完成动态加载的一个关键点就是Class类。
再百科一波:
众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。

Class 类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。如果您想借由“修改Java标准库源码”来观察Class 对象的实际生成时机(例如在Class的constructor内添加一个println()),这样是行不通的!因为Class并没有public constructor。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-81082-1.html
多少也能空出百来万的中国新娘
更新完游戏都进不了