关于Java中反射的作用义及使用方法

 更新时间:2023年07月18日 11:07:27   作者:硬件人某某某  
这篇文章主要介绍了关于Java中反射的作用义及使用方法,反射使得程序可以在运行时对类进行检查和操作,而不需要在编译时知道类的完整信息,需要的朋友可以参考下

Java 中的反射是什么?如何使用它?

在 Java 编程中,反射是一种高级的编程技术,可以在运行时动态地获取和操作类的信息。

反射使得程序可以在运行时对类进行检查和操作,而不需要在编译时知道类的完整信息。

这使得程序可以更加灵活和动态地处理对象,同时也为框架和库的开发提供了更大的自由度。

反射的基本概念

反射的核心是 java.lang.reflect 包中的一些类和接口,它们提供了获取和操作类信息的方法。

以下是一些重要的类和接口:

  • Class:表示一个类或接口的类型。
  • Constructor:表示一个类的构造方法。
  • Method:表示一个类的方法。
  • Field:表示一个类的字段。
  • Modifier:表示一个类、方法或字段的修饰符。

反射的基本思路是通过 Class 类来获取类的信息,然后使用其他类和接口来操作这些信息。可以通过以下几种方式获取 Class 对象:

  • 使用 Class.forName() 方法,传入类的全限定名。
  • 使用 .class,例如 String.class
  • 使用对象的 getClass() 方法。

反射的使用

反射的主要用途是在运行时获取和操作类的信息。例如,可以使用反射来动态地创建对象、调用方法和访问字段。

以下是一些常见的反射用法:

创建对象

可以使用 Class.newInstance() 方法来创建一个类的实例,例如:

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();

上面的代码创建了一个 java.util.Date 的实例。由于在编译时无法知道具体的类名,因此使用了 Class.forName() 方法来获取 Class 对象。然后使用 newInstance() 方法创建了一个实例。

调用方法

可以使用 Method 类来调用类的方法,例如:

Class<?> clazz = Class.forName("java.lang.String");
Object str = clazz.newInstance();
Method method = clazz.getMethod("length");
int length = (int) method.invoke(str);

上面的代码创建了一个 java.lang.String 的实例,并调用了它的 length() 方法。首先使用 Class.forName() 方法获取 Class 对象,然后使用 newInstance() 方法创建了一个实例。接下来使用 getMethod() 方法获取 length() 方法对应的 Method 对象,最后使用 invoke() 方法调用了该方法。

访问字段

可以使用 Field 类来访问类的字段,例如:

Class<?> clazz = Class.forName("java.lang.String");
Object str = clazz.newInstance();
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(str);

上面的代码创建了一个 java.lang.String 的实例,并访问了它的 value 字段。首先使用 Class.forName() 方法获取 Class 对象,然后使用 newInstance() 方法创建了一个实例。接下来使用 getDeclaredField() 方法获取 value 字段对应的 Field 对象,然后使用 setAccessible() 方法将访问权限设置为 true,最后使用 get() 方法获取了该字段的值。

获取类信息

可以使用 Class 类来获取类的信息,例如:

Class<?> clazz = Class.forName("java.lang.String");
System.out.println("类名:" + clazz.getName());
System.out.println("包名:" + clazz.getPackage().getName());
System.out.println("父类:" + clazz.getSuperclass().getName());
System.out.println("接口:" + Arrays.toString(clazz.getInterfaces()));

上面的代码获取了 java.lang.String 类的信息,打印了该类的类名、包名、父类和接口。

反射的优缺点

反射的优点在于它可以在运行时动态地获取和操作类的信息,使得程序可以更加灵活和动态地处理对象,同时也为框架和库的开发提供了更大的自由度。反射还可以用于实现类似 Spring 框架中的依赖注入等高级功能。

反射的缺点在于它会带来一定的性能损失,因为访问类的信息需要动态地获取和解析,而不是在编译时就确定好。此外,反射也会降低代码的可读性和可维护性,因为它使得代码更加复杂和难以理解。

示例代码

下面是一个使用反射实现简单的 ORM 框架的示例代码,用于将数据库中的数据映射到 Java 对象中:

public class ORM<T> {
    private final Class<T> clazz;
    public ORM(Class<T> clazz) {
        this.clazz = clazz;
    }
    public List<T> query(String sql) throws Exception {
        List<T> result = new ArrayList<>();
        try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                T obj = clazz.newInstance();
                for (Field field : clazz.getDeclaredFields()) {
                    String name = field.getName();
                    Object value = rs.getObject(name);
                    field.setAccessible(true);
                    field.set(obj, value);
                }
                result.add(obj);
            }
        }
        return result;
    }
}

上面的代码定义了一个 ORM 类,用于将数据库中的数据映射到 Java 对象中。

query() 方法中,首先使用 JDBC 连接到数据库,并执行查询语句。

然后遍历查询结果集,为每条记录创建一个 Java 对象,并将数据库中的字段值赋值给 Java 对象的属性。

可以使用以下代码来测试该 ORM 框架:

public static void main(String[] args) throws Exception {
    ORM<Person> orm = new ORM<>(Person.class);
    List<Person> persons = orm.query("SELECT * FROM person");
    for (Person person : persons) {
        System.out.println(person);
    }
}
public class Person {
    private int id;
    private String name;
    private int age;
    // 省略 getter 和 setter 方法
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

上面的代码定义了一个 Person 类,用于表示人员信息。然后使用上面的 ORM 框架从数据库中查询 person 表中的数据,并将其映射为 Person 对象。

结论

Java 中的反射是一种强大的编程工具,可以在运行时动态地获取和操作类的信息。

它可以使程序更加灵活和动态地处理对象,同时也为框架和库的开发提供了更大的自由度。

但是,反射也会带来一定的性能损失,并且降低代码的可读性和可维护性。

因此,在使用反射时需要权衡其优缺点,并根据具体情况进行选择。

到此这篇关于关于Java中反射的作用义及使用方法的文章就介绍到这了,更多相关Java反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现图书检索系统

    java实现图书检索系统

    这篇文章主要为大家详细介绍了java实现图书检索系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • SpringCloud中的Hystrix保护机制详解

    SpringCloud中的Hystrix保护机制详解

    这篇文章主要介绍了SpringCloud中的Hystrix保护机制详解,Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制,Hystrix也是Netflix公司的一款组件,需要的朋友可以参考下
    2023-12-12
  • 详解Java中的reactive stream协议

    详解Java中的reactive stream协议

    Stream大家应该都很熟悉了,java8中为所有的集合类都引入了Stream的概念。优雅的链式操作,流式处理逻辑,相信用过的人都会爱不释手。本文将详细介绍Java中的reactive stream协议。
    2021-06-06
  • 详解在Spring MVC中使用注解的方式校验RequestParams

    详解在Spring MVC中使用注解的方式校验RequestParams

    本篇文章主要介绍了详解在Spring MVC中使用注解的方式校验RequestParams ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • idea maven 项目src下的配置文件没有同步至target的解决操作

    idea maven 项目src下的配置文件没有同步至target的解决操作

    这篇文章主要介绍了idea maven 项目src下的配置文件没有同步至target的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • MyBatis-Plus中AutoGenerator的使用案例

    MyBatis-Plus中AutoGenerator的使用案例

    AutoGenerator是MyBatis-Plus的代码生成器,通过 AutoGenerator 可以快速生成 Pojo、Mapper、 Mapper XML、Service、Controller 等各个模块的代码,这篇文章主要介绍了MyBatis-Plus中AutoGenerator的详细使用案例,需要的朋友可以参考下
    2023-05-05
  • SpringBoot集成Spring Data JPA及读写分离

    SpringBoot集成Spring Data JPA及读写分离

    这篇文章主要介绍了SpringBoot集成Spring Data JPA及读写分离的相关知识,需要的朋友可以参考下
    2017-04-04
  • Java实现PDF转为线性PDF详解

    Java实现PDF转为线性PDF详解

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看。本文将通过后端Java程序实现将PDF文件转为线性化PDF。感兴趣的可以了解一下
    2021-12-12
  • 解决从Map、JSONObject取不存在键值对时的异常情况

    解决从Map、JSONObject取不存在键值对时的异常情况

    这篇文章主要介绍了解决从Map、JSONObject取不存在键值对时的异常情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • springboot3请求参数种类及接口测试案例小结

    springboot3请求参数种类及接口测试案例小结

    这篇文章主要介绍了springboot3请求参数种类及接口测试案例小结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10

最新评论