欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > java基础知识22 java的反射机制

java基础知识22 java的反射机制

2025/4/23 3:34:02 来源:https://blog.csdn.net/u011066470/article/details/144810370  浏览:    关键词:java基础知识22 java的反射机制

一 java反射机制

1.1 概述

Java反射,程序在运行时,动态获取类信息(类元数据),获取字段属性,动态创建对象和调用方法。Spring框架正是基于反射机制,通过我们的配置文件,在项目运行时创建我们的实例对象,Spring框架在这个基础上实现了对象的管理,Spring中的依赖注入就是基于这个实现的。

1.2 获取class对象的3种方式

第1种方法通过类名使用.class获取类对象。这是在编译时完成的,所以明确指定了类型User,不会导致任何错误。使用这种方法获取对象不会触发类初始化;只有在访问类的静态成员或实例时才会进行初始化。

Class<User> userClass = User.class;

User userInstance = userClass.getDeclaredConstructor(String.class, String.class).newInstance("张三", "男");

第2种方法通过对象的getClass()方法获取类对象。这种方法适用于从已实例化的类对象中获取类对象。请注意,类型不是User,而是通配符?,因为Class对象是从User的实例中获取的,实例的具体类型只能在运行时确定,而不是在编译时。

User user = new User("张三", "男");
Class<?> userClass = user.getClass();

Constructor<?> constructor = userClass.getConstructor(String.class, String.class);
User userInstance = (User) constructor.newInstance("张三", "男");

第3种方法 使用静态方法Class.forName()通过全路径获取类对象。由于类型只能在运行时知道,所以类型是通配符?。通过这种方法获取类对象将立即触发类初始化。

Class<?> userClass = Class.forName("org.example.reflect.entity.User");

Constructor<?> constructor = userClass.getDeclaredConstructor(String.class, String.class);
User userInstance = (User) constructor.newInstance("张三", "男");

1.3 案例 

1.对象

package com.ljf.lg2.daili;/*** @ClassName: Bus* @Description: TODO* @Author: admin* @Date: 2024/12/29 14:41:02 * @Version: V1.0**/
public class Bus {private String color;private int size;public String info(String color,int size){return "车子:颜色:"+color+" 大小为:"+size;}public Bus(String color, int size) {this.color = color;this.size = size;}public Bus(String color) {this.color = color;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}

1.获取对象

编译时获取对象

Bus bus = new Bus("RED",50);

System.out.println("bus:"+bus); System.out.println("========");

通过java反射获取对象

Class<?> carClass = Class.forName("com.ljf.lg2.daili.Bus");

Constructor<?> constructor = carClass.getConstructor(String.class,int.class);

//如果是无参构建函数,可以使用"tClass.newInstance()"直接构建对象。

Bus carObject =(Bus) constructor.newInstance("red",30);

System.out.println("java反射创建对象:"+carObject); System.out.println("========");

结果:

2.获取方法 

Method m = carClass.getMethod("info",String.class,int.class);
Object str = m.invoke(carObject,"red",500);
System.out.println("获取方法返回值:"+str);

结果

3.获取属性以及修改属性

Field ageField = carClass.getDeclaredField("color");
//这句在这里的作用是允许我们修改私有属性,我们可以回到Person的定义可以看到,年龄属性是私有属性,如果没有这句代码,我们去修改私有属性会抛出异常。
ageField.setAccessible(true);//
// 属性的设置
ageField.set(carObject, "yellow");
// 属性的获取
System.out.println("获取修改后属性的值:"+ageField.get(carObject));

结果: 

 

1.4 案例  

1.在 Java 中访问对象字段

Field[] fields = user.getFields();
for (Field field : fields) {
    System.out.println(field);
}

2.在 Java 中访问方法

  • getMethods()检索类及其超类中的所有公共方法。

  • getDeclaredMethods()检索类中所有声明的方法,无论访问级别如何。

  • getMethod(String name, Class<?>... parameterTypes)按名称和参数类型检索特定公共方法。

  • getDeclaredMethod(String name, Class<?>... parameterTypes)按名称和参数类型检索特定声明的方法,无论访问级别如何。

3.总结:

Declared为前缀的方法(如getDeclaredField用于检索所有字段或方法,无论其访问级别如何。相比之下,没有Declared的方法(如getField仅检索公共字段或方法。

一文讲透 Java 中的反射

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词