今天主要学习了Java中的反射(Reflection)机制,这是Java语言提供的强大功能,允许程序在运行时动态地获取类的信息、创建对象、调用方法和访问字段等。反射机制为Java程序提供了极大的灵活性和动态性,是实现框架和库等高级功能的基础。
反射是指在程序运行时,能够获取任意一个类的属性和方法,并且可以调用这些方法和访问这些属性的能力。Java的反射机制主要通过java.lang.reflect包中的类和接口来实现,如Class、Field、Method和Constructor等。
获取Class对象
Class对象是反射机制的核心,它表示一个类的类型信息。可以通过以下几种方式获取Class对象:
通过对象的getClass方法:
java
Object obj = new String("Hello");
Class clazz = obj.getClass();
通过类的.class属性:
java
Class clazz = String.class;
通过类的全限定名:
java
Class<?> clazz = Class.forName("java.lang.String");
获取类的信息
通过Class对象,可以获取类的名称、字段、方法、构造器等信息。
获取类的名称:
java
String className = clazz.getName(); // 获取全限定名
String simpleName = clazz.getSimpleName(); // 获取简单类名
获取类的字段:
java
Field[] fields = clazz.getDeclaredFields(); // 获取所有字段
Field field = clazz.getDeclaredField("fieldName"); // 获取指定字段
获取类的方法:
java
Method[] methods = clazz.getDeclaredMethods(); // 获取所有方法
Method method = clazz.getDeclaredMethod("methodName", String.class, int.class); // 获取指定方法
获取类的构造器:
java
Constructor[] constructors = clazz.getDeclaredConstructors(); // 获取所有构造器
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class); // 获取指定构造器
创建对象
通过Class对象的newInstance方法或Constructor对象的newInstance方法,可以动态地创建类的实例。
使用Class对象的newInstance方法:
java
Object obj = clazz.newInstance(); // 调用无参构造器创建对象
使用Constructor对象的newInstance方法:
java
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
Object obj = constructor.newInstance("Hello", 123); // 调用指定构造器创建对象
调用方法
通过Method对象的invoke方法,可以动态地调用类的方法。
java
Method method = clazz.getDeclaredMethod("methodName", String.class);
method.invoke(obj, "Hello"); // 调用方法
访问字段
通过Field对象的get和set方法,可以动态地访问和修改类的字段。
java
Field field = clazz.getDeclaredField("fieldName");
field.setAccessible(true); // 如果字段是私有的,需要设置可访问
Object value = field.get(obj); // 获取字段值
field.set(obj, "New Value"); // 设置字段值