java反射获取字段值_Spring核心讲解篇——反射机制

本文详细介绍了Java反射机制,包括如何通过全限定类名、类对象和实例对象获取Class类对象,以及java.lang.reflect包中用于反射的重要类。通过实例展示了如何获取类的字段信息,并利用注解生成SQL语句,展示了反射在实际开发中的应用。
摘要由CSDN通过智能技术生成

be090e824ff62d05209f928bc202f6a9.png

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!

Java架构筑基​zhuanlan.zhihu.com
091cf8f28097c5f4472a07460347a3f4.png
  • Java架构筑基——专注于Java技术的研究与分享!
  • 后续文章将首发此专栏!
  • 欢迎各位Java工程师朋友投稿和关注

反射机制

Java反射机制 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种 动态 获取的信息以及动态调用对象的方法的功能称为java语言的 反射机制

获取Class类对象的三种方式

万物皆对象,包括 也有对象,称为 类对象。要想获取类的信息首先要获取

Class类的与反射有关的重要方法:

a4d061a1ecd11c78d4e5c613563dfde4.png

获取Class类对象方式一:

// 通过类的全限定类名(包名+类名)获取类
Class clazz = Class.forName("类的全限定类名(包名+类名)");

获取Class类对象方式二:

// 直接获取类
Class clazz = Object.class;

获取Class类对象方式三:

// 通过实例对象获取其类
Class clazz = object.getClass();

*根据类加载机制,运行时一个类仅有一个类对象。

java.lang.reflect 包中的类

万物皆对象,不仅 有类对象,类的方法、字段,甚至修饰符都可以有 对象java.lang.reflect 包提供了用于通过反射获取 类信息(方法、属性、修饰符、参数等)的类、接口、异常。下面主重介绍一下有关反射的

b1f581da526b6eecd77ce5ac7e9102f6.png

反射的实际操作

案例1:

现在有个需求,想获取一个 用户实体 中所有的字段。
package com.foovv.example;
/**
 * 用户实体类
 *
 * @author 代码风水师
 * @version jdk1.8
 */
public class User {
    /** 用户id */
    private String id;

    /** 用户名称 */
    private String userName;

    /** 用户性别 */
    private String userGender;

    /** 用户年龄 */
    private Integer userAge;

    /** 用户邮箱 */
    private String email;

    /* getter & setter 方法略 */
}
package com.foovv.example;

/** 要反射类中的字段,就要引入reflect.Field类 */
import java.lang.reflect.Field;

/**
 * 反射字段的demo
 *
 * @author 代码风水师
 * @version jdk1.8
 */
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1、要想获取类的字段,就先要获取该类。下面通过全限定类名来获取的。
        Class user = Class.forName("com.foovv.example.User");
        // 2、上面已得到User类的类对象,那么下面就获取其所有字段的类对象数组
        Field[] fields = user.getDeclaredFields();

        // 3、遍历字段的数组集合,一个一个字段去处理
        for (Field field : fields) {
            // 此处的是打印User类对象中的字段名称
            System.out.println(field.getName());
        }

    }
}

输出结果:

id
userName
userGender
userAge
email

Process finished with exit code 0

案例2:

在很多框架中,常使用注解来标记类、方法、字段的特征。比如持久化框架常用来反射生成SQL,下面就动手实战一下:

实体:

package com.foovv.example;
/** 描述略 */
public class User {
    private String id;

    private String userName;

    private String userGender;

    private Integer userAge;

    private String email;

    /* getter & setter 方法略 */
}

通过反射生成SQL语句:

SELECT id, user_name, user_gender, user_age,email FROM user;

1、定义两个注解类,一个注解类Table标注实体对应的表名,另一个注解类Column标注对应的数据表的列名:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
    String value();
}

2、对实体类及其字段使用注解标注:

@Table("user")
public class User {
    @Column("id")
    private String id;

    @Column("user_name")
    private String userName;

    @Column("user_gender")
    private String userGender;

    @Column("user_age")
    private Integer userAge;

   @Column("email")
    private String email;

    /* getter & setter 方法略 */
}

3、上面做了处理,下面开始对这个实体类做反射、获取注解:

public class ReflectSql {
    public static void main(String[] args) throws ClassNotFoundException {
        // 拼接的SQL
        StringBuilder sql = new StringBuilder();

        // 1、要想获取类的字段,就先要获取该类。下面通过全限定类名来获取的。
        Class user = Class.forName("com.foovv.example.User");

        // 2、获取实体类上的Table注解,然后通过value()获取对应的表名
        // 当前你也可以使用getDeclaredAnnotations()获取注解数组,然后遍历
        Table table = (Table) user.getDeclaredAnnotation(Table.class);
        String tableName = table.value();

        // 3、获取字段上的注解,然后获取通过value()获取对应的数据表的列名
        Field[] fields = user.getDeclaredFields();
        sql.append("SELECT ");
        // 遍历每个字段
        for (int i = 0; i < fields.length; i++) {
            // 获取字段上Column注解
            Column column = fields[i].getAnnotation(Column.class);
            // 进而获取value()值,既对应指定的数据表列名
            // 拼接SQL
            sql.append(column.value());
            if (i < fields.length - 1) {
                sql.append(", ");
            }
        }
        sql.append(" FROM ");
        sql.append(tableName);
        sql.append(";");

        System.out.println(sql);
    }
}

运行结果:

SELECT id, user_name, user_gender, user_age, email FROM user;

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值