java中反射详解

本文详细介绍了Java反射的基本概念,包括如何通过Class、Constructor、Field和Method类进行运行时类型操作,如获取类信息、构造对象、访问成员变量和调用方法。
摘要由CSDN通过智能技术生成

反射

什么是反射?

反射是Java语法的一种高级特性,在“运行期间”对Java的类型信息进行检查、操作处理。

例如:加载JDBC驱动类、MyBatis动态处理resultType、Spring根据配置信息创建Bean对象等使用场景。

常见操作

  1. 获取Class类型信息
  2. 执行构造方法创建对象
  3. 调用实例方法
  4. 通过成员变量保存值和获取值

反射中常用类

1.Class类

Class对象用于保存一个类的类型信息,它是反射的入口操作。

获取Class对象的三张方式
类名
Class bookClass = Book.class;
通过forName()方法
Class cls2 = Class.forName("com.apesource.Demo.Book");
通过对象
Class cls3 = new Book().getClass();
2.Constructor类

代表一个类中的构造方法(构造器),用于创建“目标”对象

获取Constructor构造方法的方式
  • 获取无参构造方法 Class对象.getConstructor()
  • 获取有参构造方法 Class对象.getConstructor(Class…)
//获取无参构造方法
Constructor constr1 = cls2.getConstructor();
//获取有参构造方法
Constructor constr2 = cls2.getConstructor(String.class,String.class,double.class,int.class);
执行Constructor构造方法的方式
  • 执行无参构造方法 Constructor对象.newInstance()
  • 执行有参构造方法 Constructor对象.newInstance(值…)
//执行无参构造方法
Object obj2 = constr1.newInstance();
//执行有参构造方法
Object obj3 = constr2.newInstance("西游","吴承恩",120.5,500);
3.Field类

代表一个类中的成员变量(字段),用于为“目标对象”保存值和获取值

获取Field成员变量的方式
获取所有成员变量
  • public修饰的成员变量 Class对象.getFields()
  • public\private修饰的成员变量 Class对象.getDeclaredField()
Field[] fields = cl.getFields();

field.setAccessible(true);
Field[] fields = cl.getDeclaredFields();
获取指定成员变量
  • public修饰的成员变量 Class对象.getFields(成员变量名称)

  • public\private修饰的成员变量 Class对象.getDeclaredField(成员变量名称)

    Field field = cl.getField("fieldName");
    
    field.setAccessible(true);
    Field field = cl.getDeclaredField("fieldName");
    
使用Field成员变量的方式
  • Field对象.setXXX(目标对象,值)
//通过成员变量赋值
field.setAccessible(true);
field.set(obj,"葫芦娃");
4.Method类

代表一个类中的方法,用于调用执行该方法

获取Method方法的方式
  • Class对象.getMethod()
  • Class对象.getMethods()
//获取该类的指定方法
Method method = cl.getMethod(methodName, String.class);

//获取该类的方法
Method[] methods = cls.getMethods();

for(Method method : methods) {

    System.out.println(method);			
    System.out.println("修饰符:"+method.getModifiers());
    System.out.println("返回值类型:"+method.getReturnType());
    System.out.println("参数列表:");			
    for(Parameter c :  method.getParameters()){				
        System.out.print(c);
    }
    System.out.println();
    System.out.println("方法名:"+method.getName());			
    System.out.println();
}
执行Method方法的方式
  • Method对象.invoke(目标对象,方法参数)
//执行
Object invoke = method.invoke(obj, UUID.randomUUID().toString());
其他
//获取该类的接口信息
Class[] interfaces = cls.getInterfaces();

//获取该类的包信息
Package package1 = cls.getPackage();

//获取该类的父类信息
Class superclass = cls.getSuperclass();
  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值