什么是反射:
反射的本质就是得到类对象,类对象包含了类的所有信息,类对象可以得到类的属性对象,方法对象,构造函数对象。再用属性对象反向为对象设置属性,用方法对象反向执行方法,用构造对象反向构造对象。从而不需要new,而是动态的生成对象,动态的调用对象的方法。
常用情形:
- 动态执行对象的方法:
先定义一个类
package com.interview.javabasic.reflect;
public class Robot {
// 私有属性
private String name;
// 共有方法
public void sayHi(String helloSentence){
System.out.println(helloSentence + " " + name);
}
// 私有方法
private String throwHello(String tag){
return "Hello " + tag;
}
}
动态执行对象的方法:
package com.interview.javabasic.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectSample {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException {
Class rc = Class.forName("com.interview.javabasic.reflect.Robot");
Robot r = (Robot) rc.newInstance();
Method getHello = rc.getDeclaredMethod("throwHello", String.class);
getHello.setAccessible(true);
// 执行方法
Object str = getHello.invoke(r, "Bob");
Field name = rc.getDeclaredField("name");
// 设置属性
name.setAccessible(true);
name.set(r, "Alice");
sayHi.invoke(r, "Welcome");
}
}
类对象先生成方法和对象,再可以通过方法.invoke(Object o, 方法参数)执行对象的方法。即不需要new好的对象,就可以动态调用对象的方法。动态代理就是用的这一原理。
以前是过类得到对象,反射通过对象得到类对象,得到类对象就得到了一切。
注意点:
- 每个类只有一个类对象,在代码编译的时候,就生成了类对象。
- Robot r = (Robot) rc.newInstance(); 无参构造,有参构造要先通过类对象获得构造对象。
获得类对象的三种方法:
1.对象获取
//1.对象获取
Person p=new Person();
Class c=p.getClass();
2.类名获取,
Class c1=Person.class;
3.Class类的静态方法获取 包名.类名
Class cl=Class.forName("demo01.Person");