反射机制
- 什么是动态语言?
当程序运行时,允许改变程序结构或变量类型,这种语言叫做动态语言,比如python。
但是Java并不是一种动态语言,但是它有一套非常突出的动态相关机制,叫做reflection
Class类
- Java中不是对象的东西?
Static修饰的东西,属于类
普通的数据类型,如int、char等
其他的都是对象,连类本身,也是java.lang.Class的对象 - 任何一个类都是Class类的实例化对象,这种实例化对象有三种表达方式:
F f = new F() ;
Class c1 = F.class; //1. 任何一个类都有一个隐含的静态成员变量class
Class c2 = f.getClass(); //2. 已知该类的对象的情况下,通过getClass()方法获取
Class c3 = null;
C3 = Class.forName(“com.text.F”); //3. 类的全称
- 通过类的类类型创建该类的对象实例:
Foo foo = (Foo) c1.getNewInstance()
方法的反射
- Class有一个最简单的方法,getName()
- Method类:所有方法是Method类的对象
- 通过方法的反射的相关步骤:
获取该类的类类型
通过该类类型获取该类的方法
循环遍历所获取到的方法
通过这些方法的getReturnType得到返回值类型的类类型,又通过该类类型得到返回值的名字
getName()得到方法的名称,getParameterTypes()获得这个方法里面的参数类型的类类型
成员变量的反射
成员变量是java.lang.reflect.Field类的对象,通过getFields()方法获取所有public的成员变量的信息,通过getDeclaredFields()获取自己声明的成员变量
构造函数的放射
构造函数是Constructor类的对象
Class c = obj.getClass();
Constructor[] cs = c.getDeclaredConstructors();
Class[] paramTypes = constructor.getParameterTypes();
Class类的动态加载类
编译时刻加载的类是静态加载,运行时刻加载的类是动态加载。需要的时候再生成
Stand s = (Stand) cl.newInstance();
Class B implements Stand{
Public void start(){
System.out.print("B...satrt");}}