博客
关于我
java反射介绍
阅读量:791 次
发布时间:2023-01-28

本文共 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字段值等操作。

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

    你可能感兴趣的文章
    (反射+内省机制的运用)简单模拟spring IoC容器的操作
    查看>>
    (转)tomcat7.0 manager app和host manager web管理
    查看>>
    .Net(C#)实现异步编程
    查看>>
    .Net中webBrowser控件JS交互
    查看>>
    02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除
    查看>>
    04-docker-commit构建自定义镜像
    查看>>
    04-docker系列-commit构建自定义镜像
    查看>>
    05-docker系列-使用dockerfile构建镜像
    查看>>
    09-docker系列-docker网络你了解多少(下)
    查看>>
    10-docker系列-docker文件共享和特权模式
    查看>>
    #C2#S2.2~S2.3# 加入 factory/objection/virtual interface 机制
    查看>>
    #C8# UVM中的factory机制 #S8.1.1# OOP 语言三大特性 systemverilog的支持
    查看>>
    #C8# UVM中的factory机制 #S8.1.4# 约束的重载
    查看>>
    #C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形
    查看>>
    #C8# UVM中的factory机制 #S8.4.1# factory机制的实现
    查看>>
    900行c语言贪吃蛇,原生js实现的贪吃蛇网页版游戏完整实例
    查看>>
    ado读取多条oracle数据,Oracle ADO数据存取
    查看>>
    asp.mvc 4项目发布文件目录结构_如何用SpringBoot(2.3.3版本)快速搭建一个项目?文末有小彩蛋...
    查看>>
    aspen串联反应怎么输入_如何进步提升串联谐振试验装置的稳定性
    查看>>
    c++ string取子串_Integer与String的设计哲学
    查看>>