`
dcriori
  • 浏览: 97111 次
社区版块
存档分类
最新评论

Java中取得Bean的所有Field(包括SuperClass中的fields)

阅读更多
      前些日子在用Annotation的时候,发现了一个问题,就是使用下面的代码可以获取到当前类中的Fields,但是不能得到superclass中的fields。
Class类是Reflection API 中的核心类,它有以下方法
 getName():获得类的完整名字。
 getFields():获得类的public类型的属性。
 getDeclaredFields():获得类的所有属性。 这里应该是当前类的所有属性
 getMethods():获得类的public类型的方法。
 getDeclaredMethods():获得类的所有方法。
 getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
 getConstructors():获得类的public类型的构造方法。
 getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
 newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
java 代码
 
  1. package study;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. public class MyBean extends BaseBean {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             Class cls=Class.forName(MyBean.class.getName());  
  13.             Field[] fields=cls.getDeclaredFields();  
  14.             System.out.println("==================");  
  15.             for(Field f:fields){  
  16.                 System.out.println("field:"+f.getName());  
  17.             }  
  18.             System.out.println("==================");  
  19.         } catch (ClassNotFoundException e) {  
  20.             // TODO Auto-generated catch block  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  
  24.   
  25.     private String porp1;  
  26.     private String prop2;  
  27.     private String prop3;  
  28.     public String getPorp1() {  
  29.         return porp1;  
  30.     }  
  31.     public void setPorp1(String porp1) {  
  32.         this.porp1 = porp1;  
  33.     }  
  34.     public String getProp2() {  
  35.         return prop2;  
  36.     }  
  37.     public void setProp2(String prop2) {  
  38.         this.prop2 = prop2;  
  39.     }  
  40.     public String getProp3() {  
  41.         return prop3;  
  42.     }  
  43.     public void setProp3(String prop3) {  
  44.         this.prop3 = prop3;  
  45.     }  
  46. }  
BaseBean的代码是:
java 代码
 
  1. package study;  
  2.   
  3. public class BaseBean {  
  4.     private int id;  
  5.     private String remark;  
  6.     public int getId() {  
  7.         return id;  
  8.     }  
  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getRemark() {  
  13.         return remark;  
  14.     }  
  15.     public void setRemark(String remark) {  
  16.         this.remark = remark;  
  17.     }  
  18. }  

运行的结果是:
java 代码
  1. ==================  
  2. field:porp1  
  3. field:prop2  
  4. field:prop3  
  5. ==================  
你会发现父类中的field id、remark 并没有打印出来。
怎么样得到他们呢?
首先将main函数改为如下:
java 代码
 
  1.     public static void main(String[] args) {
            try {
                Class cls = Class.forName(MyBean.class.getName());
                for (;!cls.equals(Object.class); cls = cls
                        .getSuperclass()) {
                    Field[] field = cls.getDeclaredFields();
                    for(Field f : field){
                        System.out.println(f.getName());
                    }
                }
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
运行结果:
java 代码
  1. porp1  
  2. prop2  
  3. prop3  
  4. id  
  5. remark  
最主要的一段代码就是这里
java 代码
 
  1. for (;!cls.equals(Object.class); cls = cls  
  2.                     .getSuperclass()) {  
  3.                 Field[] field = cls.getDeclaredFields();  
  4. ....................... 
  5. }
巧妙的运用了for循环语句。如果还有其它的条件要加进来的话,就写在!cls.equals(Object.class);这段里,比如
java 代码
 
  1. for (; field == null && !cls.equals(Object.class); cls = cls  
  2.                     .getSuperclass()) {  
  3. .......................  
  4. }  
分享到:
评论

相关推荐

    用反射的方式获取父类中的所有属性和方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。本文将深入探讨如何使用反射来获取父类中的所有属性和方法,这对于理解和调试...

    Test_invoke_super_range.rar_Superclass

    在Java中,继承允许一个类(子类)继承另一个类(超类)的属性和方法。当子类需要覆盖超类的方法或者显式调用超类的实现时,`super`关键字就派上用场了。以下是一些关于如何使用`super`的关键点: 1. **构造器调用*...

    java toString ToStringBuilder ReflectionToStringBuilder

    本篇文章将深入探讨几种在Java中实现`toString()`方法的方式,包括自定义、使用`ToStringBuilder`和`ReflectionToStringBuilder`。 首先,自定义`toString()`是最基础的方式。开发者可以根据需求手动编写代码,列出...

    java异常机制小结

    Error 是 Java 语言中严重错误的 superclass,表示程序中严重的错误,如内存溢出、栈溢出等。Exception 是 Java 语言中非严重错误的 superclass,表示程序中非严重的错误,如除数为零、数组越界等。 三、Java 异常...

    java反射机制学习(三):通过反射获取实体类的属性、方法、接口和父类信息

    在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含各种属性(如姓名、年龄等)和方法(如获取和设置属性值的方法)。例如: ```java public class Person { private String name; ...

    java反射详解

    在Java中,可以通过任何对象的`.getClass()`方法来获取该对象所属类的`Class`对象。`Class`对象包含了关于该类的所有信息。 ```java Object obj = new Object(); System.out.println(obj.getClass().getName()); ``...

    Java Reflection (JAVA反射)详解

    Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...

    Test_invoke_super.rar_Superclass

    在Java中,`super`关键字用于引用当前对象的父类实例,允许我们调用父类的构造函数或者覆盖的方法。例如: ```java class Superclass { void method() { System.out.println("Superclass method"); } } class ...

    Java如何获取泛型类型

    参考:我眼中的Java-Type体系(1) 我眼中的Java-Type体系(2) 秒懂Java类型(Type)系统 Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现...

    Java 接口与继承

    接口在Java中是一种完全抽象的类,它只包含常量和抽象方法。接口的目的是定义一种规范,使得不同类可以遵循这个规范来实现特定的功能。接口的使用弥补了Java单一继承的限制,因为一个类可以实现多个接口。 子类和...

    Instance of Subclass, Subclass, Instance of Superclass, Superclass,

    在这个例子中,`Subclass` 是 `Superclass` 的子类,它继承了 `Superclass` 的所有公共属性和方法。 接下来,"Instance of Subclass" 和 "Instance of Superclass" 描述的是对象的类型。当我们创建一个子类的实例时...

    java 中的接口与继承

    接口在Java中是一种完全抽象的类型,它只包含常量定义和抽象方法声明,没有方法实现。接口的主要作用是定义一种规范,让不同的类遵循这个规范来实现特定的功能。接口通过关键字`interface`声明,并使用分号隔开各个...

    The method of type must override a superclass method解决方式, myeclipse, java, web

    首先,让我们了解Java中的方法重写。当一个子类需要扩展或修改父类的功能时,会覆盖父类的方法。重写的规定是:子类方法必须与父类被重写的方法有相同的返回类型、方法名以及参数列表。此外,子类方法的访问修饰符不...

    Java反射机制课件ppt

    通过反射,开发者可以获取到一个类的Class对象,它是对Java类的抽象表示,包含了关于类的所有信息。Class对象可以通过类名.class或者对象.getClass()来获取。 2. **Java Reflection API** Java Reflection API ...

    JAVA语言程序设计期末题库.pdf

    3. **方法签名**:在Java中,方法的签名由方法名和参数列表决定。如果要让一个方法可以直接通过类名调用,而不需创建类的实例,那么应该使用`static`关键字修饰这个方法。 4. **数组操作**:Java中的数组可以通过索...

    java 30个基本概念

    16. **Object类**:Java中的所有类都隐式或显式地继承自Object类,Object类提供了如equals()、toString()等基础方法。 17. **equal()与toString()**:equal()方法用于比较两个对象是否相等,toString()返回对象的...

    论JAVA继承机制中父类与子类的关系

    在Java中,子类可以通过以下方式重写父类的属性和方法: - **数据成员的重写**:当子类定义了一个与父类同名的数据成员时,子类成员将隐藏父类成员,即在子类中默认情况下无法直接访问父类成员。 - **方法的重写**...

    java全集.pdf JAVA全集

    - **静态类**:在Java中,类本身不能被声明为静态的。 **7.5 Singleton模式** - 保证一个类只有一个实例,并提供一个全局访问点。 **7.6 final关键字** - **final变量不能被改变**:一旦赋值后就不能再更改。 - ...

Global site tag (gtag.js) - Google Analytics