Java反射常用api

2023-12-24 15:48:12

反射API方法的说明:

  1. Class.forName("className"):
    • 作用:通过类的全名获取对应的Class对象。
    • 示例:Class<?> stringClass = Class.forName("java.lang.String");
  2. clazz.getConstructor(Class<?>... parameterTypes):
    • 作用:获取类的指定构造器。
    • 示例:Constructor<?> stringConstructor = stringClass.getConstructor(String.class);
  3. constructor.newInstance(Object... initargs):
    • 作用:使用构造器创建类的实例。
    • 示例:String greeting = (String) stringConstructor.newInstance("Hello, World!");
  4. clazz.getDeclaredField(String name):
    • 作用:获取类的指定字段,包括私有字段。
    • 示例:Field stringValueField = stringClass.getDeclaredField("value");
  5. field.setAccessible(true):
    • 作用:设置字段为可访问,以便访问私有字段。
    • 示例:stringValueField.setAccessible(true);
  6. field.get(Object obj):
    • 作用:获取字段的值。
    • 示例:char[] charArray = (char[]) stringValueField.get(greeting);
  7. clazz.getDeclaredMethod(String name, Class<?>... parameterTypes):
    • 作用:获取类的指定方法,包括私有方法。
    • 示例:Method lengthMethod = stringClass.getDeclaredMethod("length");
  8. method.invoke(Object obj, Object... args):
    • 作用:调用类的方法。
    • 示例:int length = (int) lengthMethod.invoke(greeting);
  9. clazz.getSuperclass():
    • 作用:获取类的父类。
    • 示例:Class<?> superClass = stringClass.getSuperclass();
  10. clazz.getInterfaces():
    • 作用:获取类实现的接口。
    • 示例:Class<?>[] interfaces = stringClass.getInterfaces();
  11. clazz.getModifiers():
    • 作用:获取类的修饰符。
    • 示例:int modifiers = stringClass.getModifiers();
  12. Modifier.isPublic(int modifiers):
    • 作用:检查修饰符是否表示类是公共的。
    • 示例:boolean isPublic = Modifier.isPublic(modifiers);

这些API方法允许您在运行时检查和操作类的构造器、字段、方法、父类、接口和修饰符信息,从而实现了反射的核心功能。通过这些方法,您可以在运行时动态处理类的结构和实例。

import java.lang.reflect.*;

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        // 通过类的全名获取Class对象
        Class<?> stringClass = Class.forName("java.lang.String");

        // 获取String类的有参构造器
        Constructor<?> stringConstructor = stringClass.getConstructor(String.class);

        // 使用构造器创建一个String对象
        String greeting = (String) stringConstructor.newInstance("Hello, World!");

        // 获取String类的私有字段
        Field stringValueField = stringClass.getDeclaredField("value");

        // 设置私有字段为可访问
        stringValueField.setAccessible(true);

        // 获取字段的值(字符数组)
        char[] charArray = (char[]) stringValueField.get(greeting);

        // 获取String类的length()方法
        Method lengthMethod = stringClass.getDeclaredMethod("length");

        // 调用length()方法获取字符串的长度
        int length = (int) lengthMethod.invoke(greeting);

        // 获取String类的父类
        Class<?> superClass = stringClass.getSuperclass();

        // 获取String类实现的接口
        Class<?>[] interfaces = stringClass.getInterfaces();

        // 检查String类的修饰符
        int modifiers = stringClass.getModifiers();
        boolean isPublic = Modifier.isPublic(modifiers);

        // 输出结果
        System.out.println("Class Name: " + stringClass.getName());
        System.out.println("Superclass Name: " + superClass.getName());
        System.out.println("Implemented Interfaces: ");
        for (Class<?> iface : interfaces) {
            System.out.println("  " + iface.getName());
        }
        System.out.println("Is Public Class: " + isPublic);
        System.out.println("Field Value: " + new String(charArray));
        System.out.println("String Length: " + length);
    }
}

文章来源:https://blog.csdn.net/weixin_52236586/article/details/135181677
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。