博客
关于我
java反射介绍
阅读量:792 次
发布时间: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/

    你可能感兴趣的文章
    Java---设计模式app小软件汇总应用
    查看>>
    Java-JUC(五):闭锁(CountDownLatch)
    查看>>
    Java-slf4j:sfl4j
    查看>>
    java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS
    查看>>
    java-如何给表格添加分页
    查看>>
    Java-环境搭建(Mac版)
    查看>>
    Java-笔记12
    查看>>
    java-设计模式-装饰器设计模式,代理设计模式和继承三种扩展方法的比较
    查看>>
    java.io.IOException: Tried to send an out-of-range integer as a 2-byte value :79944
    查看>>
    java.io.tmpdir
    查看>>
    java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated
    查看>>
    java农副产品网上预订系统(ssm)
    查看>>
    java农副产品购物app的设计与开发(ssm)
    查看>>
    JAVA分布式系统
    查看>>
    java分布式链路追踪;jvm应用监控-skywalking
    查看>>
    Java创建elasticsearch的model时,如何配置使用ik分词器?
    查看>>
    java加密解密
    查看>>
    java勤工助学管理系统
    查看>>
    JAVA反射
    查看>>
    Java反射
    查看>>