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
名字被我改了,哈哈
时间: 2024-08-10 00:04:41

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

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

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

java.lang.reflect.Field

java.lang.reflect.Field 一.Field类是什么 Field是一个类,位于java.lang.reflect包下. 在Java反射中 Field类描述的是 类的属性信息,通俗来讲 有一个类如下: 1 package com.testReflect; 2 public class FieldDemo { 3 public int num1 = 1; 4 protected int num2 = 2; 5 int num3 = 3; 6 private int num4 = 4

java反射系列一

一.概念认知 1.1  ●Java ReflectionReflection (反射)是被视为动态语言的关键, 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息, 并能直接操作任意对象的内部属性及方法 1.2 ●Java反射机制提供的功能?在运行时判断任意一 个对象所属的类 ?在运行时构造任意-个类的对象?在运行时判断任意一个类所具有的成员变量和方法 ?在运行时调用任意个对象的成员变量和方法 ?生成动态代理 1.3  Java反射机制研究及应用●反射相关的主要API

java反射系列五之获取类的完整结构

代码示例 Person类 package reflect; @MyAnnotation(value = "guozi") public class Person extends Creature<String> implements Comparable,MyInterface{ public String name; private int age; public Person() { super(); // TODO Auto-generated constructor

java反射系列六之调用属性与方法

调用指定属性 package reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestFiled { public static void main(String[] args) throws Exception { TestFiled t = new TestFiled(); t.test3(); } //调用运行时类中的指定的属性 public void test

Java学习系列(二十一)Java面向对象之注解详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45295947 一.前言 Java中的注解Annotation运用到很多方面,比如之前讲的单元测试中的@Test.Spring.SpringMVC还有其他框架等等.Java本身自带的注解也有一些,比如:@Override(子类要重写/覆写父类的对应方法).@Deprecated(表示方法不建议被使用).@SuppressWarnings(抑制警告)等等.当然,我们也可以自定义一些自己需要的

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

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

java.lang.reflect.Field详解

首先说一下个人观点,Field类,我认为它所代表的事一个实体类的所有属性,因为它的很多方法都是作用在类与属性之间的,下面让我们分析一下Field类的一些方法.  boolean equals(Object obj) 将此 Field 与指定对象比较. 详解: 让我们看一下它的方法: 我们会发现equals方法的参数一定要是Field的类型的.也就是说我们所进行比较的也是Field的类型的进行比较,如果我们输入null或非Field的类型会返回false.(问题:为何不直接用Field,直接用Fi

java.lang.reflect.InvocationHandler中invoke()方法调用时机

Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的. invoke方法的完整形式如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable       {              method.invoke(obj, args);