java反射--Field

news/2024/5/19 3:31:06 标签: java, 泛型, 反射


反射中有个属性类Field,其提供关于属性的操作,下面通过一个实例来展示Field的运用!


首先:


需要弄清楚 getFields()和getDeclaredFields()获取属性字段的区别:


getFields():获取该类中的public属性,包括从父类中继承的public属性字段。仅限public修饰的属性。


getDeclaredFields():获取该类中的所有属性,包括public,protected,private,【默认】修饰的属性。但是不包括父类的所有属性。


LeftEntity le = new LeftEntity();

Class clazz = le.getClass();

Field[] fields = clazz.getDeclaredFields();

// 该属性的修饰符
int modifiers  = field.getModifiers();

下面是modifiers的值分别对应的修饰符:

0:默认的
1:public
2:private
4:protected



实例代码Field  


下面上实例代码【实例目的:把RightEntity中属性的值赋给LeftEntity的相同属性】:


首先,实体类[由于只是测试反射,所以实体类中的属性注释就没写了,没有实际意义]:


java">package com.main.src.entity;

import java.util.Date;

public class RightEntity {

    public String name       = null;

    public String pass       = null;

    public int    age        = 0;

    public Date   createDate = null;

    /************区分字段******************/

    public String constrict  = null;

    public String province   = null;

    public RightEntity() {
        this.name = "张三";
        this.pass = "123456";
        this.age = 20;
        this.createDate = new Date();
        this.constrict = "西湖区";
        this.province = "浙江省";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getConstrict() {
        return constrict;
    }

    public void setConstrict(String constrict) {
        this.constrict = constrict;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

}



java">package com.main.src.entity;

import java.util.Date;

public class LeftEntity {

    private String name       = null;

    public String  pass       = null;

    int            age        = 0;

    protected Date createDate = null;

    /************区分字段******************/

    public String  country    = null;

    public String  city       = null;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

}



实现类:

java">package com.main.src.businessImpl;

import java.lang.reflect.Field;

public class BizImpl {

    /**
     * 通过泛型定义的方法,给两个类的相同属性赋值
     * 
     * @param <T>
     * @param <K>
     * @param t
     * @param k
     * @return
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    public static <T, K> T entityValueChange(T t, K k) throws IllegalArgumentException,
                                                      IllegalAccessException {

        // 获取类加载对象Class
        Class claT = t.getClass();

        Class claK = k.getClass();

        // 获取该类中所有属性
        Field[] fieldTs = claT.getDeclaredFields();

        Field[] fieldKs = claK.getDeclaredFields();

        for (Field fieldt : fieldTs) {
            // 当该属性修饰符不是public的场合,需要给该属性添加可访问标识
            if (fieldt.getModifiers() != 1) {
                fieldt.setAccessible(true);
            }

            for (Field fieldk : fieldKs) {

                // 当属性名称和类型都相同的时候才赋值
                if (fieldt.getName().equals(fieldk.getName())
                    && fieldt.getType() == fieldk.getType()) {

                    if (fieldk.getModifiers() != 1) {
                        fieldk.setAccessible(true);
                    }

                    // 赋值
                    fieldt.set(t, fieldk.get(k));
                }

            }

        }
        // 返回值
        return t;
    }

}


测试执行类:

java">    /**
     * 
     * @param args
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     * @throws NoSuchFieldException 
     * @throws SecurityException 
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     */
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {

        // 有值的实体类
        RightEntity re = new RightEntity();
        // 待赋值实体类
        LeftEntity le = new LeftEntity();

        // 给实体相同属性赋值
        le = BizImpl.entityValueChange(le, re);

        // 在这里获取类加载对象Class的时候,还可以用这种方法获取【Class clazz = LeftEntity.class;】
        Class clazz = le.getClass();

        // 获取该类所有属性并打印值
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            // 当该属性修饰符不是public的场合,需要给该属性添加可访问标识
            if (field.getModifiers() != 1) {
                field.setAccessible(true);
            }
            System.out.println(field.getName() + "=" + field.get(le));
        }

    }


程序执行结果:

java">name=张三
pass=123456
age=20
createDate=Wed Oct 28 17:47:28 CST 2015
country=null
city=null


----反射赋值(此可以用于解析socket报文体,DecodeMessage用):

java">String body = "1&2&3&4&5&6&7&8&9&10&11&12";

String[] fieldValues = StringUtils.split(body, "&");

Field[] fields = ClassA.class.getDeclaredFields();

Object obj = new ClassA();

for (int i = 0; i < fieldValues.length; i++) {
	fields[i].setAccessible(true);
	fields[i].set(obj, fieldValues[i]);
}

System.out.println(obj);




对这个感兴趣的朋友可以执行看看,最好是自己写一个,看着是简单的例子,不写完全发现不了其中隐藏的细节问题,这里就不一一说明了!


欢迎指出不足的地方,一起多探讨!!!!





http://www.niftyadmin.cn/n/1332829.html

相关文章

Spring MVC01

1.简介 2.HelloWorld程序 3.Spring MVC的执行流程 4.对静态资源访问 5.注解的开发方式 6.响应传值 7.SpringMVC对JSON的支持 8.格式化JSON 一、简介 1.什么是MVC模型 MVC模型&#xff1a;是一种架构型的模式&#xff0c;本身不引入新功能&#xff0c;只是帮助我们将开发…

可伸缩的Web架构发展史

无意中发现这篇文章&#xff0c;对 【可伸缩的Web架构】 发展做了简单明了的讲解&#xff0c;值得推荐&#xff01;本文转载自这里近些年来&#xff0c;越来越多的行业开始和互联网结合&#xff0c;诞生了越来越多的互联网创业公司。互联网创业公司需要面对许多的不确定因素。如…

Spring MVC02

1.请求传参方式 2.日期类型处理 3.处理中文乱码问题 4.文件上传 5.文件下载 6.拦截器的使用 一、请求传参方式 1.情况一 最传统的方式,方法参数中带入request,通过request.getParameter("参数名"),再封装到JavaBean中(不要求掌握). <%--Created by IntelliJ…

SSM01

1、目录结构 2、准备项目的依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"htt…

navicat 创建存储过程

再简单的东西长时间不用了就会出错&#xff0c;特此即时的记录下来&#xff0c;以便以后参考&#xff01; 以下为navicat 创建存储过程步骤图解&#xff1a; 1. 2. 3. 4. 在存储过程正文中是输入一行语句测试用&#xff0c;点击保存 5.输入存储过程名称&#xff0c;点击确定 6.…

索引(index)_普通索引、唯一索引和复合索引.索引查询

索引对于优化数据库查询效率方面有着非常巨大的作用&#xff0c;下面是一个简单索引查询效率示例&#xff0c;希望能帮到一些朋友。 前提&#xff1a;范例表user_info&#xff0c;通过存储过程插入6万条数据。 表结构&#xff1a; 存储过程&#xff1a; BEGINDECLARE i INT;SET…

SSM02

1.mybatis逆向工程 2.多条件查询的实现 3.查询动态SQL 4.条件回显 5.分页功能 6.分页功能完善 一、mybatis逆向工程 1.简介 mybatis是目前很流行的持久层框架&#xff0c;其逆向工程更是大大缩减了我们的开发时间。所谓mybatis逆向工程&#xff0c;就是mybatis会根据我们…

OSI七层模型和TCP/IP模型

首先关于OSI七层模型和TCP/IP模型&#xff1a; OSI模型的由来&#xff1a;国际标准化组织(ISO)定义了网络协议的基本框架&#xff0c;被称为OSI模型。 虽然国际标准化组织制定了这样一个网络协议的模型&#xff0c;但是实际上互联网通讯使用的网络协议是TCP/IP网络协议。 OS…