概念
通过反射机制,可以在运行时获得程序或者程序集中每个类型的成员和成员信息。
反射应用
通过反射获取Class对象
//1、 通过完整路径名获取Class对象Class clazz = Class.forName("com.test.reflection.Student");//2、 通过类的class属性(需要导入类的包)Class clazz = Student.class;//3、 通过对象的getClass()函数Student student = new Student();Class clazz = student.getClass();
获取成员变量
(1) getDeclaredFields // 获取所有声明字段,包括共有字段和私有字段clazz.getDeclaredFields();(2) getFields // 仅获取公有字段clazz.getFields();
获取构造函数
(1) getDeclaredConstructors // 获取所有构造方法clazz.getDeclaredConstructors();(2) getConstructors // 仅获取共有构造方法clazz.getConstructors();
获取非构造方法
(1) getDeclaredMethods; // 获取所有声明的非构造函数clazz.getDeclaredMethods();(2) getMethods; // 仅获取公有的非构造函数,(可以同时获得到父类的方法)clazz.getMethods();Method[] methods = clz.getMethods();for(Method method : methods){System.out.println(method.getName());}打印结果:setUsernamesetAgegetUsernamegetAgewaitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll
创建对象的方法
(1) 通过Class对象的newInstance()方法Class clazz = User.class;User use = (User) clazz.newInstance();(2) 通过Constructor对象的newInstance()方法Class clazz = Class.forName("com.test.reflection.user");Constructor constructor = clazz.getConstructor();User user = (User) constructor.newInstance();同时,该方法可以选择特定构造方法,而Class对象则智能使用默认的无参构造方法Class clazz = User.class;Constructor constructor = clazz.getConstructor(String.class);User user = (User) constructor.newInstance("hyx");
利用反射创建数组
@Testpublic void createArray() throws ClassNotFoundException {Class<?> clazz = Class.forName("java.lang.String");Object array = Array.newInstance(clazz, 2);Array.set(array, 0, "hyx");Array.set(array, 1, "whm");System.out.println(Array.get(array, 1));}
