Java属于半动态语言,即程序运行时可以改变其结构,新的函数可以引进,旧的函数可以删除。而且,在运行状态中,任意一个类都能知道这个类的所有属性和方法,并且对任意一个对象,都能调用他的任意一个方法
反射的应用场合
程序运行时可以收到外部传入的对象,这个对象在编译时类型可以是Object,由此无法预知该对象到底属于哪个类,在运行时,为了发现这个对象的真实信息,就需要用反射机制了。
反射API
- Class
- Field
- Method
- Constructor
反射使用步骤
- 获取想要操作的类的Class对象,通过Class对象我们就可以调用任意类的方法
获取Class对象的三种方法
- 调用对象的getClass()
Person p = new Person(); Class c = p.getClass(); - 调用class属性
Class c = Person.class;- 使用forName()静态方法 (最安全)
// 括号里填对于类的路径 Class c = Class.forName("reflection.Person"); - 调用对象的getClass()
- 调用Class类的方法,这就是反射的使用阶段
- 使用反射API操作
创建对象的两种方法
- 调用Class对象的newInstance()方法: 当类的Constructor为空时
Class c = Class.forName("reflection.Person"); Person p = (Person) c.newInstance() - 先获取Class的指定Constructor,再调用Constructor的newInstance()方法:当类的Constructor不为空时
Class c = Class.forName("reflection.Person"); Consturctor cons = c.getDeclaredConstructor(String.class,String.class); Person p = (Person) c.newInstance("小明","男");