自学内容网 自学内容网

java中反射详解

反射

什么是反射?

反射是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();

原文地址:https://blog.csdn.net/ji_xin0721/article/details/136241376

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!