java反射介绍
发布日期:2025-04-02 02:16:20 浏览次数:8 分类:精选文章

本文共 3805 字,大约阅读时间需要 12 分钟。

.reverseTranslate {font-family: Arial, sans-serif;line-height: 1.6;margin: 20px 0;}

反射(Reflection)是Java中非常重要的一项机制,也称为 reflection。它使Java在运行时对自身进行检查,并能够直接操作程序的内部属性或方法。

Java反射机制中的常用类

反射API中包含大量关于Java元数据的信息,包括:package、type parameters、superclass、implemented interfaces、inner classes、outer classes、fields、constructors、methods、modifiers等。常用的类包括:

  • Class:标识某个具体的类或接口。
  • Constructor:封装了类的构造方法。
  • Method:提供关于类或接口的方法的信息。
  • Field:提供有关类或接口的属性信息,以及对其动态访问的权限。
  • Class类

    Class类是反射机制的起始点,获取Class对象的方式有多种:

    • getClass():通过指定类的对象调用,例如 Class cl = str.getClass();
    • getSuperclass():通过Class类调用,返回类的父类,例如 Class clsup = cl.getSuperClass();
    • Class.forName():动态加载类,即 Class cl2 = Class.forName("java.lang.String");
    • .Class:通过类名访问类,即 Class cl3 = String.Class;
    • TYPE语法:用于基本类型类的访问,如 Class cl4 = Integer.TYPE;

    Class类的重要方法包括:

  • public static Class forName(String className):动态加载类。
  • public T newInstance():根据类创建新实例。
  • public ClassLoader getClassLoader():获取类的类加载器。
  • public String getName():获取类的名称。
  • public native Class getSuperclass():获取类的父类。
  • public java.net.URL getResource(String name):获取资源路径。
  • Constructor类

    Constructor类用于反射类的构造器信息,常用的方法包括:

    • Constructor getConstructor(Class[] params):根据参数类型获取构造器。
    • Constructor[] getConstructors():获取所有公共和非公constructors。
    • Constructor getDeclaredConstructor(Class[] params):获取指定参数的声明构造器。
    • Constructor[] getDeclaredConstructors():获取所有声明的构造器。

    Constructor类的重要方法包括:

    • public String getName():获取构造器名称。
    • public native int getModifiers():获取修饰符。
    • public Class[] getParameterTypes():获取参数类型。
    • public Object newInstance(Object... initargs):创建新实例。

    Method类

    Method类用于反射类和接口的方法信息,常用的方法包括:

    • Method getMethod(String name, Class[] params):获取指定名称和参数的方法。
    • Method[] getMethods():获取所有公方法,包括继承的和接口的。
    • Method getDeclaredMethod(String name, Class[] params):获取指定名称和参数的声明方法。
    • Method[] getDeclaredMethods():获取该类所有声明方法。

    Method类的重要方法包括:

    • public String getName():获取方法名称。
    • public native int getModifiers():获取修饰符。
    • public Class[] getParameterTypes():获取参数类型。
    • public Object invoke(Object obj, Object... args):调用目标对象的方法。

    Field类

    Field类用于反射类和接口的属性信息,常用的方法包括:

    • Field getField(String name):获取指定名称的属性字段。
    • Field[] getFields():获取所有公属性字段。
    • Field getDeclaredField(String name):获取指定名称的声明属性字段。
    • Field[] getDeclaredFields():获取该类所有声明属性字段。

    Field类的重要方法包括:

    • public String getName():获取字段名称。
    • public native int getModifiers():获取字段修饰符。
    • public Class getType():获取字段类型。
    • public Object get(Object obj):获取指定对象的字段值。

    反射应用示例

    以下是一个通过反射反射阿里巴巴样例代码的示例:

    package net.peace.ref;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Stack;public class TestRef {    public static void main(String[] args) {        try {            Class c = Class.forName("java.util.Stack");            Method[] ms = c.getDeclaredMethods();            for (Method m : ms) {                System.out.println(m.getModifiers() + " " + m.getReturnType() + " " + m.getName());                Class[] cc = m.getParameterTypes();                for (Class p : cc) {                    System.out.println(p.getName());                }                Class[] ce = m.getExceptionTypes();                for (Class p : ce) {                    System.out.println(p.getName());                }            }            System.out.println("******************************");                        Constructor[] con = c.getDeclaredConstructors();            for (Constructor p : con) {                System.out.println(p);            }            System.out.println("******************************");                        Field[] field = c.getDeclaredFields();            for (Field f : field) {                System.out.println(f);            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }}

    上述代码展示了如何通过反射获取Stack类的方法、构造器和字段,并动态创建Stack对象、调用Stack方法、设置Stack字段值等操作。

    上一篇:Java反射代码编写
    下一篇:java反射 反射构造函数 报 wrong number of arguments 错误

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月05日 15时28分25秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    a推b等价于非a或b_AB胶/蜜月胶常见问题的原因分析及解决方法 2023-01-24
    c++ string取子串_Integer与String的设计哲学 2023-01-24
    c++ 数组批量赋值_数组之间不能赋值?穿个马甲吧! 2023-01-24
    cad模糊查询符号_mysql 正则模式和like模糊查询 2023-01-24
    continue可以用if判断里面吗_谁能说说if()else()里的continue是干嘛的? 2023-01-24
    ctrl c 和 ctrl v 不能用了_神奇操作,原来CTRL键还能这么用 2023-01-24
    cytoscape安装java_Cytoscape史上最全攻略 2023-01-24
    c语言程序设计年历显示,C语言程序设计报告《万年历》.doc 2023-01-24
    C语言程序设计梁海英答案,1.5 习题 2023-01-24
    c语言编写单片机中断,C语言AVR单片机中断程序写法 2023-01-24
    ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结 2023-01-24
    embedding层_【预估排序】Embedding+MLP: 深度学习预估排序通用框架(一) 2023-01-24
    excel中最常用的30个函数_Excel玩转数据分析常用的43个函数! 2023-01-24
    flink sql设置并行度_Flink 参数配置和常见参数调优 2023-01-24
    go 字符串替换_Go 每日一库之 quicktemplate 2023-01-24
    hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版... 2023-01-24
    html上传图片直接保存到数据库中,Editor上传图片路径存入数据库中怎么弄? 2023-01-24
    ICLOUD储存空间要升级吗_有人像我一样需要恢复苹果手机icloud空间ios备份时 微信卡住不动了吗(已解决)... 2023-01-24
    jaccard相似度_自然语言处理之文本相似度计算 2023-01-24
    java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单! 2023-01-24