一、反射的概述
什么是反射
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
反射就是把java类中的各种成分映射成一个个的Java对象
加载完类之后,在堆内的方法区中就产生了一个Class类型的对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构,例如:一个类里有成员变量,方法,包等信息,通过反射可以把类中的个个组成信息映射为对象。
注:一个类在内存中只有一个Class对象。(可以输出两个不同Class对象的hashCode()进行对比)
一个类被加载后,类的整个结构都会被封装在Class对象中。
Class类
常用方法:
方法名 | 功能说明 |
---|---|
Static ClassforName(String name) | 返回指定类name的Class对象 |
Object newInstance() | 调用缺省构造函数,返回Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类,接口,数组类或void)的名称 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class[] getinterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Constructor[] getConstructors | 返回一个包含某些Constructor对象的数组 |
Method getMothed(String name,Class…T) | 返回一个Method对象,此对象的形参类型为paramType |
Fidld[] getDeclaredFields() | 返回Field对象的一个数组 |
(更多方法和描述可从jdk1.8API文档查看和学习)
正常类加载时:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
而反射的源头就是Class类,针对任何你想动态加载、运行的类,只能先获得相应的Class对象
常规方法:
反射方法: