我是靠谱客的博主 明亮戒指,最近开发中收集的这篇文章主要介绍JAVA反射系列之Field,java.lang.reflect.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 对象所表示的类或接口的所有可访问公共字段

    来一个例子来说明一下 :

   实体类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  import  java.util.Date;
/**
  * @ClassName: Student
  * @Description: 学生实体
  * @author JoseanLuo  
  * @date 2014-3-18 下午5:17:35
  * @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;
}
   
}

     测试类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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类型方法,这里也不一一列举了,下面放代码。


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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)  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());
         
}
     
     
}

这个是控制台输出:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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使用获取方法。的全部内容,希望文章能够帮你解决JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部