博客
关于我
Java反射机制详解
阅读量:804 次
发布时间:2019-03-25

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

反射机制

反射机制是Java语言的一个核心功能,允许程序在运行时对类、对象进行动态操作。以下是对反射机制的详细解析。

一、反射机制的定义

反射机制允许在运行时对任意类进行操作,具体包括:

  • 获取类的所有属性和方法。
  • 调用任意对象的方法或获取属性值。
  • 动态构造类对象。

这种动态性质使反射机制在代码调试、动态 proxy 创建以及反转工程等场景中至关重要。

二、反射机制的功能

反射机制的主要功能包括:

  • 判断对象所属的类。
  • 构造指定类的对象。
  • 获取类的成员变量和方法。
  • 调用对象的任意方法。
  • 生成动态代理。

三、获取Class对象的方式

获取Class对象可以通过以下方法:

  • 使用类文字(如MyClass.class)。
  • 使用getClass()方法获取对象的类。
  • 使用forName(String className)方法动态加载类。

例如:

Class c1 = MyClass.class;Class c2 = new MyClass().getClass();Class c3 = Class.forName("reflect.MyClass");

四、Class对象的信息获取

通过Class对象可以获取类的详细信息:

  • 类名和包名getSimpleName()获取简单类名,getName()获取完整类名。
  • 修饰符getModifiers()返回修饰符整数值,可通过Modifier.toString()转换为文本形式。
  • 超类和接口getSuperclass()获取超类,getInterfaces()获取实现的接口。

例如:

Class c = MyClass.class;System.out.println("简单类名:" + c.getSimpleName());System.out.println("完整类名:" + c.getName());Package p1 = c.getPackage();System.out.println("包名:" + p1.getName());int modifiers = c.getModifiers();String mod = Modifier.toString(modifiers);System.out.println("修饰符:" + mod);Class[] interfaces = c.getInterfaces();for (Class in : interfaces) {    System.out.println(in);}

五、获取类的字段

通过Field类获取字段:

  • 获取所有字段:getFields()getDeclaredFields()
  • 根据字段名获取字段:getField(String name)getDeclaredField(String name)

例如:

Class c = MyClass.class;Field[] fields1 = c.getDeclaredFields();for (Field f : fields1) {    int mod = f.getModifiers();    String modifiers = Modifier.toString(mod);    Class type = f.getType();    String typeName = type.getSimpleName();    System.out.println(modifiers + " " + typeName + " " + f.getName());}Field[] fields2 = c.getFields();for (Field f : fields2) {    int mod = f.getModifiers();    String modifiers = Modifier.toString(mod);    Class type = f.getType();    String typeName = type.getSimpleName();    System.out.println(modifiers + " " + typeName + " " + f.getName());}

六、获取类的构造函数

通过Constructor类获取构造函数:

  • 获取所有构造函数:getConstructors()getDeclaredConstructors()
  • 根据参数类型获取特定构造函数:getConstructor(Class... parameterTypes)getDeclaredConstructor(Class... parameterTypes)

例如:

Class c = MyClass.class;Constructor[] constructors = c.getConstructors();for (Constructor constructor : constructors) {    String modifiers = getModifiers(constructor);    String constructorName = constructor.getName();    // 输出构造函数信息}

七、获取类的实例方法

通过Method类获取方法:

  • 获取所有方法:getMethods()getDeclaredMethods()
  • 根据方法名和参数类型获取特定方法:getMethod(String name, Class... parameterTypes)getDeclaredMethod(String name, Class... parameterTypes)

例如:

Class c = MyClass.class;Method[] methods = c.getDeclaredMethods();for (Method m : methods) {    System.out.println("方法名:" + m.getName());    System.out.println("修饰符:" + getModifiers(m));    // 输出其他方法信息}

八、通过Class对象创建对象

通过反射创建对象的步骤:

  • 获取构造函数。
  • 使用newInstance()创建对象或使用invoke()调用带参数的构造函数。
  • 例如:

    Class myClass = MyClass.class;MyClass obj = myClass.newInstance();Constructor constructor = myClass.getConstructor(int.class, String.class);MyClass obj = constructor.newInstance(1, "abc");

    九、数组操作

    反射也支持对数组进行操作:

    • 获取数组信息:Array.getLength()Array.get()
    • 修改数组值和大小:Array.set()Array.newInstance()

    例如:

    int[] array = {1, 2, 3, 4, 5};Class demo = array.getClass().getComponentType();System.out.println("数组类型:" + demo.getName());System.out.println("数组长度:" + Array.getLength(array));System.out.println("数组的第一个元素:" + Array.get(array, 0));Array.set(array, 0, 100);System.out.println("修改后的数组第一个元素:" + Array.get(array, 0));

    通过以上方法,可以充分利用反射机制进行动态操作和灵活开发。

    转载地址:http://ivbyk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    Mysql 拼接多个字段作为查询条件查询方法
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>