1.反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
2.获取反射中的Class对象
在 Java API 中,获取 Class 类对象有三种方法:
- 第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
Class clz = Class.forName("java.lang.String");
- 第二种,使用 .class 方法。这种方法只适合在编译前就知道操作的 Class。
Class clz = String.class;
- 第三种,使用类对象的 getClass() 方法。
String str = new String("Hello");
Class clz = str.getClass();
3.方法说明
public class AuncleB {
public static void main(String[] args) throws Exception {
Class<? extends UserBean> userBean = new UserBean().getClass();
//获得所有的构造器(包括私有的,共有的..)
userBean.getDeclaredAnnotations();
//获得所有共有的构造器
userBean.getAnnotations();
//获得所有的字段(包括私有的,共有的..)
userBean.getDeclaredFields();
//获得所有的共有字段
userBean.getFields();
//获得指定的字段
userBean.getField("name");
//获得所有的方法 (包括私有的,共有的..)
userBean.getDeclaredMethods();
//获得所有的共有的方法
userBean.getMethods();
//获得指定的方法
userBean.getMethod("name",UserBean.class);
//获得对象实例
userBean.newInstance();
}
}
4.调用
public class AuncleB {
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("com.auncle.bean.UserBean");
Object o = aClass.newInstance();
Method method = aClass.getMethod("set" + "UserName", String.class);
//调用Method invoke 赋值
method.invoke(o, "auncle");
Method method1 = aClass.getMethod("getUserName");
//调用Method invoke 获得对象里面的值
Object invoke = method1.invoke(o);
System.out.println(invoke);
}
}