一.反射引入
1.动态语言:
程序运行时,可以改变程序结构或变量类型,典型的有:python、javascript。java不是动态语言,但它有动态性,反射就是java动态性的一个体现。
2.反射概念:
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。即加载完类以后,就产生了一个Class对象,这个对象包含完整的类的结构信息,我们可以通过这个对象看到类的结构信息,这个对象就像一面镜子,因此我们形象的称之为“反射”。
3.获得Class对象的三种方式
- .class.
- getclass() 这是Object类的一个方法,要使用得先创建对象
- class for Name("类的全路径名") (最常使用)
//第一种
Class clazz1=String.class;
//第二种
User u=new User();
Class clazz2=u.getClass();
//第三种
try {
Class clazz3=Class.forName("com.reflect.User");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二.应用反射API获取类的信息
Class clazz;
1、获取类名
- clazz.getName() 获取 类的全路径(包名+类名)
- clazz.getSimpleName() 获取类名
2、获取属性信息
- clazz.getFields() 得到public修饰的属性信息
- clazz.getDeclaredFields() 得到所有属性信息(包括private)
- clazz.getDeclaredField("属性名"); 得到指定属性信息
3、获取方法信息
- clazz.getMethods(); 得到public修饰的方法
- clazz.getMethod(name, parameterTypes) 得到指定public修饰的方法
- clazz.getDeclaredMethods(); 得到所有方法信息(包括private)
- clazz.getDeclaredMethod(name, parameterTypes) 得到指定所有方法信息(包括private),因为java中有方法重载,只给方法名无法得到确定的方法,故如果所要调用的方法有参,则必须传参数类型。
4、获取构造器信息
- clazz.getConstructors(); 得到public修饰的构造方法
- clazz.getConstructor(parameterTypes); 得到指定public修饰的构造方法信息,
- clazz.getDeclaredConstructors(); 得到所有构造方法信息(包括private)
- clazz.getDeclaredConstructor(parameterTypes) 得到指定所有构造方法信息(包括private)
5、构造对象
- clazz.newInstance() 通过反射调用无参构造方法(故在Javabean类中必须有无参构造函数)
- Constructor c=clazz.getDeclaredConstructor(parameterTypes) c.newInstance(initargs) initargs里填具体列类型对应的值
6、利用反射调用方法
- Method method=clazz.getDeclaredMethod(name, parameterTypes) method.invoke(obj, args)
7、通过反射操作属性
- Field f=clazz.getDeclaredField(name); f.set(obj, value);