Java中的反射机制

178 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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);