JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。   转载https://my.oschina.net/u/1407116/blog/209383
摘要

java.lang.reflect.Field使用 Field.

首先必须明一点 Field类主要是用来辅助获取和操作类的属性的

1.怎么通过反射获取类的属性

先来看JDK提供的方法有如下几种:

a)Class.getDeclaredField(String name);

     返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段

     b)Class.getDeclaredFields();

      返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

    c)Class.getField(String name);

       返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段

    d)Class.getField();

返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

来一个例子来说明一下 :

实体类:

 import java.util.Date;
/**
 * @ClassName: Student
 * @Description: 学生实体  
 * @version V1.0 
 */
public class Student
{
  private Long id;
  private String name;
  private Date createdate;
  private String no;
  public String nickname;
public Long getId()
{
    return id;
}
public void setId(Long id)
{
    this.id = id;
}
public String getName()
{
    return name;
}
public void setName(String name)
{
    this.name = name;
}
public Date getCreatedate()
{
    return createdate;
}
public void setCreatedate(Date createdate)
{
    this.createdate = createdate;
}
public String getNo()
{
    return no;
}
public void setNo(String no)
{
    this.no = no;
}
public String getNickname()
{
    return nickname;
}
public void setNickname(String nickname)
{
    this.nickname = nickname;
}
  
}

测试类:

import java.lang.reflect.Field;
import java.util.Date;
/**
 * @ClassName: ReflectFieldTest
 * @Description: 反射Field测试。
 * @author JoseanLuo  
 * @date 2014-3-18 下午5:16:17
 * @version V1.0 
 */
public class ReflectFieldTest
{
 
    public static void main(String[] args)
{    Student stu=new Student();
     stu.setId(1L);
     stu.setName("Josean");
     stu.setNo("201403185203344");
     stu.setCreatedate(new Date());
     try
    {
        Field property1=stu.getClass().getDeclaredField("name");
        System.out.println(property1);//private java.lang.String com.cx.test.Student.name
        Field property3=stu.getClass().getField("nickname");
        System.out.println(property3);//public java.lang.String com.cx.test.Student.nickname
        //错误方法 getField系列方法只能获取公共字段
        //Field property2=stu.getClass().getField("name");
        //System.out.println(property2);
        //会抛java.lang.NoSuchFieldException
        
        
    } catch (SecurityException e)
    {
        
        e.printStackTrace();
    } catch (NoSuchFieldException e)
    {
        
        e.printStackTrace();
    }
}
    
    
}

2.进行属性获取更改

   得到这个Field之后你就可以获取他的值或者设置他的值了。

   获取他的值用get类型方法,他针对常见类型提供了对应get方法,这里就不一一列举了。

   值得注意的是获取私有属性的时候必须先设置Accessible为true,然后才能获取。

   同理设置的时候调用set类型方法,这里也不一一列举了,下面放代码。

import java.lang.reflect.Field;
import java.util.Date;
/**
 * @ClassName: ReflectFieldTest
 * @Description: 反射Field测试。
 * @version V2.0
 */
public class ReflectFieldTest
{
 
    public static void main(String[] args) throws Exception
{    Student stu=new Student();
     stu.setId(1L);
     stu.setName("Josean");
     stu.setNo("201403185203344");
     stu.setCreatedate(new Date());
     stu.setNickname("copyman");
        Field property1=stu.getClass().getDeclaredField("name");
        //System.out.println(property1);//out:private java.lang.String com.cx.test.Student.name
        Field property3=stu.getClass().getField("nickname");
        System.out.println(property3.get(stu));
        //System.out.println(property3);//out:public java.lang.String com.cx.test.Student.nickname
        //错误方法 getField系列方法只能获取公共字段
        //Field property2=stu.getClass().getField("name");
        //System.out.println(property2);
        //会抛java.lang.NoSuchFieldException
        Field [] prFields4=stu.getClass().getDeclaredFields();
        for(Field field:prFields4)
        {
            System.out.println(field);
            System.out.println(field.equals(property1));
            //私有变量必须先设置Accessible为true
            field.setAccessible(true);
            //获取用get类方法。
            System.out.println(field.get(stu));
        }
        //设置用set类方法
        property3.set(stu, "名字被我改了,哈哈");
         
        System.out.println(stu.getNickname());
        
}
    
    
}

这个是控制台输出:

copyman
private java.lang.Long com.cx.test.Student.id
false
1
private java.lang.String com.cx.test.Student.name
true
Josean
private java.util.Date com.cx.test.Student.createdate
false
Tue Mar 18 18:19:39 CST 2014
private java.lang.String com.cx.test.Student.no
false
201403185203344
public java.lang.String com.cx.test.Student.nickname
false
copyman
名字被我改了,哈哈

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法的更多相关文章

  1. java.lang.reflect.Field

    java.lang.reflect.Field 一.Field类是什么 Field是一个类,位于java.lang.reflect包下. 在Java反射中 Field类描述的是 类的属性信息,通俗来讲 ...

  2. Java反射API研究(2)——java.lang.reflect详细内容与关系

    对于最新的java1.8而言,reflect中接口的结构是这样的: java.lang.reflect.AnnotatedElement java.lang.reflect.AnnotatedType ...

  3. 基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解

    1.前言 项目中都会使用常量类文件, 这些值如果需要变动需要重新提交代码,或者基于@Value注解实现动态刷新, 如果常量太多也是很麻烦; 那么 能不能有更加简便的实现方式呢? 本文讲述的方式是, 一 ...

  4. java 反射提取类信息, 动态代理 和过滤某些方法演示

    java 反射提取类信息, 动态代理 和过滤某些方法演示 package org.rui.classts.reflects; import java.lang.reflect.Constructor; ...

  5. Java基础系列1:Java基本类型与封装类型

    Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...

  6. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  7. 如何通过java反射的方式对java私有方法进行单元测试

    待测试的私有方法: import org.testng.Assert;import org.testng.annotations.BeforeClass;import org.testng.annot ...

  8. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  9. 夯实Java基础系列5:Java文件和Java包结构

    目录 Java中的包概念 包的作用 package 的目录结构 设置 CLASSPATH 系统变量 常用jar包 java软件包的类型 dt.jar rt.jar *.java文件的奥秘 *.Java ...

随机推荐

  1. jQuery提交form表单

    <form id="search_form" name="search_form" method="post"> <inp ...

  2. swift学习二:基本的语法

    声明本文转载自:http://www.cocoachina.com/applenews/devnews/2014/0603/8653.html Swift是什么? Swift是苹果于WWDC 2014 ...

  3. Working with Strings(使用Oracle字符串)

    Working with Strings By Steven Feuerstein  Part 3 in a series of articles on understanding and using ...

  4. HTML5图片预览

    两种方式实现 URL FileReader <!DOCTYPE HTML><html>    <head>    <meta charset="ut ...

  5. R基础

    R的对象类型包括数值型(numeric),复数型(complex),逻辑型(logical),字符型(character)和原味型(raw),列表(list)递归结构:函数(function)和表达式 ...

  6. Error in invoking target 'agent nmhs' of makefile

    安装Oracle11g报错:Error in invoking target 'agent nmhs' of makefile  解决方法:cd $ORACLE_HOME/sysman/libvi i ...

  7. Linq 中的Select事例

    ---恢复内容开始--- 1.对查询结果进行转换. string[] names={"ADE","Jerry","Steves"}; var ...

  8. Emmet 插件使用教程

    1)使用 Emmet 生成 HTML 的语法详解生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 doctype.html.head.body 以及 meta 等内容.你只需要输入一个 ...

  9. css控制父元素下的子元素自适应高度,且高度一致

    css代码: .wrap{width:600px;margin:0 auto; overflow:hidden;} .left{background:#ccc;width:300px;float:le ...

  10. c++数组操作

    一.数组定义和初始化 : 一维数组初始化: : 标准方式一: ]; // value[i]的值不定,没有初始化 : 标准方式二: ] = {,}; // value[0]和value[1]的值分别为1 ...