I. 简介
A. Java反射的定义:
Java反射是Java提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息。更重要的是,Java反射还允许我们实例化新的对象、调用方法和访问字段。简而言之,反射就是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。
B. 反射的作用和意义:
运行时类型识别:反射能够识别出对象所属的类以及类的属性和方法,以此来意识到对象的运行时类型。
动态加载类和灵活调用方法:反射可以动态的加载类并创建对象,调用方法,通过反射我们可以在运行时动态地创建和操作 对象,这使得Java的动态性大大增强。
对象序列化:通过反射可以轻松地实现对象的序列化操作。
设计通用方法和框架:反射的动态特性,让我们在设计通用方法和框架时有了更大的灵活度。
II. Java反射的基本操作
A. 获取Class对象的三种方式
// 方式1:通过类名.class的方式 Class clazz1 = String.class; // 方式2:通过对象的getClass方法 String str = "hello"; Class clazz2 = str.getClass(); // 方式3:通过完整类名(需要抛出ClassNotFoundException) Class clazz3 = Class.forName("java.lang.String");
B. 使用Class类的newInstance方法创建对象
Class clazz = String.class; try { String str = (String) clazz.newInstance(); // 默认调用空参构造器 } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); }
C. 获取构造方法并创建对象
Class clazz = String.class; try { Constructor constructor = clazz.getConstructor(String.class); String str = (String) constructor.newInstance("Hello World"); } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); }
D. 获取成员变量并使用
Class clazz = MyClass.class; MyClass myClassInstance = new MyClass(); Field field = clazz.getField("myField"); field.set(myClassInstance, "New Value");
E. 获取成员方法并使用
Class clazz = String.class; try { Method method