Java反射

反射

定义

Java反射(Java Reflection)是Java编程语言提供的一种机制,允许在运行时检查和修改对象的状态和行为。通过反射,您可以获取对象的类信息、方法、字段等,并在运行时调用它们。这种机制对于在运行时动态创建对象、修改对象的状态或调用对象的方法非常有用。

反射相关对象

  1. Class对象:表示Java类或接口的反射对象。可以使用Class对象获取类的信息,如方法、字段等。
  2. Method对象和Field对象:分别表示类的公共方法和字段的反射对象。可以使用这些对象在运行时调用方法或访问字段。
  3. 反射异常:反射操作可能会引发异常,如ClassNotFoundException、IllegalAccessException等。需要处理这些异常以确保程序的正确性和稳定性。

优缺点

优点

运行时判断任意一个对象所属的类。

运行时判断一个类所具有的成员变量和方法。

运行时任意调用一个对象的方法。

运行时构造任意一个类的对象。

缺点

代码可读性低;

性能低;

破坏封装性。

使用场景

  1. 动态代理
  2. JDBC的class.forName
  3. BeanUtils的值拷贝
  4. Spring的IOC、DI

怎么使用反射

1.获取类的字段

import java.lang.reflect.Field;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("java.lang.String");
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field.getName());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

2.获取类的所有方法

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("java.util.ArrayList");
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

3.调用私有方法

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.*;
import static java.lang.*;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("java.util.ArrayList"); 
            Method method = clazz.getDeclaredMethod("add", Object.class); 
            List<Object> list = new ArrayList<>();
            method.setAccessible(true); 
            method.invoke(list, "Hello");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(java基础,java,python,开发语言)