zoukankan      html  css  js  c++  java
  • JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

    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
    名字被我改了,哈哈
  • 相关阅读:
    在javaWeb 工程中 tomcat 的 web.xml 文件配置
    Spring 框架详解
    构建工具 Maven和Gradle对比
    idea 创建Javaweb 动态工程
    服务器后端 项目代码常用目录图
    ET模式下的EPOLLOUT
    linux recv 参数len设置为0
    fork 和 exec 对子进程继承父进程处理信号处理函数的影响
    lua元表以及元方法
    Linux网络编程“惊群”问题总结
  • 原文地址:https://www.cnblogs.com/chengpeng15/p/5883715.html
Copyright © 2011-2022 走看看