前些日子在用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 代码
- package study;
-
- import java.lang.reflect.Field;
-
- public class MyBean extends BaseBean {
-
-
-
-
- public static void main(String[] args) {
- try {
- Class cls=Class.forName(MyBean.class.getName());
- Field[] fields=cls.getDeclaredFields();
- System.out.println("==================");
- for(Field f:fields){
- System.out.println("field:"+f.getName());
- }
- System.out.println("==================");
- } catch (ClassNotFoundException e) {
-
- e.printStackTrace();
- }
- }
-
- private String porp1;
- private String prop2;
- private String prop3;
- public String getPorp1() {
- return porp1;
- }
- public void setPorp1(String porp1) {
- this.porp1 = porp1;
- }
- public String getProp2() {
- return prop2;
- }
- public void setProp2(String prop2) {
- this.prop2 = prop2;
- }
- public String getProp3() {
- return prop3;
- }
- public void setProp3(String prop3) {
- this.prop3 = prop3;
- }
- }
BaseBean的代码是:
java 代码
- package study;
-
- public class BaseBean {
- private int id;
- private String remark;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getRemark() {
- return remark;
- }
- public void setRemark(String remark) {
- this.remark = remark;
- }
- }
运行的结果是:
java 代码
- ==================
- field:porp1
- field:prop2
- field:prop3
- ==================
你会发现父类中的field id、remark 并没有打印出来。
怎么样得到他们呢?
首先将main函数改为如下:
java 代码
- 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 代码
- porp1
- prop2
- prop3
- id
- remark
最主要的一段代码就是这里
java 代码
- for (;!cls.equals(Object.class); cls = cls
- .getSuperclass()) {
- Field[] field = cls.getDeclaredFields();
- .......................
- }
巧妙的运用了for循环语句。如果还有其它的条件要加进来的话,就写在!cls.equals(Object.class);这段里,比如
java 代码
- for (; field == null && !cls.equals(Object.class); cls = cls
- .getSuperclass()) {
- .......................
- }
分享到:
相关推荐
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。本文将深入探讨如何使用反射来获取父类中的所有属性和方法,这对于理解和调试...
在Java中,继承允许一个类(子类)继承另一个类(超类)的属性和方法。当子类需要覆盖超类的方法或者显式调用超类的实现时,`super`关键字就派上用场了。以下是一些关于如何使用`super`的关键点: 1. **构造器调用*...
本篇文章将深入探讨几种在Java中实现`toString()`方法的方式,包括自定义、使用`ToStringBuilder`和`ReflectionToStringBuilder`。 首先,自定义`toString()`是最基础的方式。开发者可以根据需求手动编写代码,列出...
Error 是 Java 语言中严重错误的 superclass,表示程序中严重的错误,如内存溢出、栈溢出等。Exception 是 Java 语言中非严重错误的 superclass,表示程序中非严重的错误,如除数为零、数组越界等。 三、Java 异常...
在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含各种属性(如姓名、年龄等)和方法(如获取和设置属性值的方法)。例如: ```java public class Person { private String name; ...
在Java中,可以通过任何对象的`.getClass()`方法来获取该对象所属类的`Class`对象。`Class`对象包含了关于该类的所有信息。 ```java Object obj = new Object(); System.out.println(obj.getClass().getName()); ``...
Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...
在Java中,`super`关键字用于引用当前对象的父类实例,允许我们调用父类的构造函数或者覆盖的方法。例如: ```java class Superclass { void method() { System.out.println("Superclass method"); } } class ...
参考:我眼中的Java-Type体系(1) 我眼中的Java-Type体系(2) 秒懂Java类型(Type)系统 Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现...
接口在Java中是一种完全抽象的类,它只包含常量和抽象方法。接口的目的是定义一种规范,使得不同类可以遵循这个规范来实现特定的功能。接口的使用弥补了Java单一继承的限制,因为一个类可以实现多个接口。 子类和...
在这个例子中,`Subclass` 是 `Superclass` 的子类,它继承了 `Superclass` 的所有公共属性和方法。 接下来,"Instance of Subclass" 和 "Instance of Superclass" 描述的是对象的类型。当我们创建一个子类的实例时...
接口在Java中是一种完全抽象的类型,它只包含常量定义和抽象方法声明,没有方法实现。接口的主要作用是定义一种规范,让不同的类遵循这个规范来实现特定的功能。接口通过关键字`interface`声明,并使用分号隔开各个...
首先,让我们了解Java中的方法重写。当一个子类需要扩展或修改父类的功能时,会覆盖父类的方法。重写的规定是:子类方法必须与父类被重写的方法有相同的返回类型、方法名以及参数列表。此外,子类方法的访问修饰符不...
通过反射,开发者可以获取到一个类的Class对象,它是对Java类的抽象表示,包含了关于类的所有信息。Class对象可以通过类名.class或者对象.getClass()来获取。 2. **Java Reflection API** Java Reflection API ...
3. **方法签名**:在Java中,方法的签名由方法名和参数列表决定。如果要让一个方法可以直接通过类名调用,而不需创建类的实例,那么应该使用`static`关键字修饰这个方法。 4. **数组操作**:Java中的数组可以通过索...
16. **Object类**:Java中的所有类都隐式或显式地继承自Object类,Object类提供了如equals()、toString()等基础方法。 17. **equal()与toString()**:equal()方法用于比较两个对象是否相等,toString()返回对象的...
在Java中,子类可以通过以下方式重写父类的属性和方法: - **数据成员的重写**:当子类定义了一个与父类同名的数据成员时,子类成员将隐藏父类成员,即在子类中默认情况下无法直接访问父类成员。 - **方法的重写**...
- **静态类**:在Java中,类本身不能被声明为静态的。 **7.5 Singleton模式** - 保证一个类只有一个实例,并提供一个全局访问点。 **7.6 final关键字** - **final变量不能被改变**:一旦赋值后就不能再更改。 - ...