一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
反射的概述
java的反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译器就完成确定,在运行期仍然可以扩展。
获取Class类的对象
- 使用类的class属性来获取该类对应的Class对象。
Class<Student> c = Student.class;
- 调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法。
Student s = new Student();
Class<? extends Student> c = s.getClass();
- 使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径。
Class<?> c Class.forName("cn.zh.Student");
反射获取构造方法,成员变量和方法
- 反射获取构造方法
Class<?> c = Class.forName("cn.zh.Student");
//getConstructors():只能获取public修饰的构造方法
Constructor<?>[] cons = c.getConstructors();
//getDeclaredConstructors():可以获取到所有的构造方法
Constructor<?>[] cons = c.getDeclaredConstructors();
//getConstructor(Class<?>...parameterTypes):获取单个构造方法
//getDeclaredConstructor(Class<?>...parameterTypes)
Constructor<?> con = c.getConstructor(); //无参构造方法
//T newInstance(Object... initargs):使用此Constructor对象表示的构造函数,使用指定的参数来创建和初始化对象
Object obj = con.newInstance();
Constructor<?> con = c.getConstructor(String.class, Integer.class, String.class);
- 反射获取成员变量
Class<?> c = Class.forName("cn.zh.Student");
//Field[] getFields():获取public修饰的成员变量
//Field[] getDeclaredFields():获取所有的成员变量
Field[] fields = c.getFields();
//Field getField(String name):获取单个成员变量
//Field getDeclaredField(String name)
Field field = c.getField("name");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
// void set(Object obj, Object value)
field.set(obj, "张三");
- 反射获取成员方法
Class<?> c = Class.forName("cn.zh.Student");
//Method[] getMethods():获取public修饰的方法
//Method[] getDeclaredMethods();
Method[] methods = c.getMethods();
//Method[] getMethod(String name, Class<?>... parameterTypes)
//Method[] getMethod(String name, Class<?>... parameterTypes)
Method m = c.getMethod("method");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//Object invoke(Object obj, Object... args)
m.invoke(obj);