由于工作需要,需要拿到一个对象的属性的属性的属性。没骗你,这是真的。当然,这真的不算什么,不就才3级的属性调用嘛,天天写的。我要说的是,这3个属性中,前2个是在其父类中声名的,第一个是protected,后两个都是private的。这3级,没有一级提供Getter和Setter。同时,这3级的代码,都是jar包中的,我反编译加Debug,才知道有这个东西的。正常的调用,第一个属性都拿不到的。
这种情况下,不用反射,是走投无路了。当然,反射用在这样的地方,不是一个好的选择。但没办法,项目赶,jar包的代码我又动不了,这个东西,我又一定要,没它不行。所以,只能用反射出个临时的解决方案。
废话少说,自己尝试的过程,也不叙述了,只把最后能跑的例子贴出来。
1、先写个父类,叫Person
package com.lippeng.helloworld;
public class Person {
private String name = "xiaoming";// 例子嘛,追求简单 和 有代表性,只保留这一个属性
}
2、写个子类,叫XiaoMing
package com.lippeng.helloworld;
public class XiaoMing extends Person {
// 遗憾的事,这里面什么都没有,哈哈。。。
}
3、准备工作做完了,看看我的HelloWorld吧!
package com.lippeng.helloworld;
import java.lang.reflect.Field;
public class HelloWorld {
public static void main(String[] args) {
Object object = new XiaoMing();
String fieldName = "name";
Object value = getFieldValue(object, fieldName);
if (value != null) {
System.out.println(value);// 不好意思,忘记了,这里输出的不是"Hello World!",而是"xiaoming"。哈哈。。。
} else {
System.out.println("什么都没拿到。。。");
}
}
/**
* get the field value in aObject by aFieldName
*
* @param aObject
* @param aFieldName
* @return
*/
private static Object getFieldValue(Object aObject, String aFieldName) {
Field field = getClassField(aObject.getClass(), aFieldName);// get the field in this object
if (field != null) {
field.setAccessible(true);
try {
return field.get(aObject);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return null;
}
/**
* 这个方法,是最重要的,关键的实现在这里面
*
* @param aClazz
* @param aFieldName
* @return
*/
private static Field getClassField(Class aClazz, String aFieldName) {
Field[] declaredFields = aClazz.getDeclaredFields();
for (Field field : declaredFields) {
// 注意:这里判断的方式,是用字符串的比较。很傻瓜,但能跑。要直接返回Field。我试验中,尝试返回Class,然后用getDeclaredField(String fieldName),但是,失败了
if (field.getName().equals(aFieldName)) {
return field;// define in this class
}
}
Class superclass = aClazz.getSuperclass();
if (superclass != null) {// 简单的递归一下
return getClassField(superclass, aFieldName);
}
return null;
}
}
这样就完了?是的,这样就完了。有了这些,上面的3级属性调用,如同儿戏。
分享到:
相关推荐
### Java反射操作父类所有属性和方法 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的特性,它允许程序在运行时动态地获取类的信息,并能够直接操作这些信息。通过反射,我们可以获取类的字段、...
在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细...
在Java中,一个类(子类)可以继承另一个类(父类),通过关键字`extends`来实现。这样,子类就拥有了父类的所有非私有(public和protected)成员,包括字段(属性)和方法。但是,子类可能会添加自己的特有属性,...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性、方法和实现。本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试...
综上所述,`JsonUtil`是一个自定义的工具类,它利用Java反射API实现了对包含public属性和父类属性的Java对象的JSON序列化和反序列化。理解和使用这个类需要对Java反射、JSON处理以及可能使用的库(如Jackson或Gson)...
在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含各种属性(如姓名、年龄等)和方法(如获取和设置属性值的方法)。例如: ```java public class Person { private String name; ...
接下来,我们创建一个名为`ReflectorClass`的辅助类,其中包含一个静态方法`getPropertyName`,这个方法接受一个对象实例作为参数,通过反射获取该对象的所有属性名及对应的类型,并返回一个字符串,每个属性名与...
在Java中,我们通常使用JSON库如Jackson、Gson或org.json来处理JSON数据。然而,当面对未知类结构或动态类型需求时,反射提供了一种解决方案。 要将JSON字符串转换为Java对象,我们首先需要将JSON解析成一个Map或...
在Java中,私有方法和私有属性通常不允许外部类直接访问,这是为了保护类的封装性。然而,通过反射机制,我们可以绕过这些限制。以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class...
Java反射 API 主要包含在 `java.lang.reflect` 包中,包括 `Class` 类、`Constructor` 类、`Method` 类和 `Field` 类等。 首先,让我们了解如何使用反射获取类的信息。假设我们有一个名为 `Person` 的类: ```java...
在Java中,子类可以通过以下方式重写父类的属性和方法: - **数据成员的重写**:当子类定义了一个与父类同名的数据成员时,子类成员将隐藏父类成员,即在子类中默认情况下无法直接访问父类成员。 - **方法的重写**...
反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? 要使用反射,首先需要获取类的`Class`对象。可以通过以下几种方式获取: 1. **使用类名**:...
在Java中,通过访问修饰符(如public、private、protected)来实现封装。 4. **继承**:继承允许一个类(子类)从另一个类(父类)继承属性和方法,实现了代码的重用和扩展。Java支持单一继承,即一个子类只能有一...
在Java中,类是静态的,它们在编译期间就被确定下来。然而,反射允许我们在运行时检查和操作这些类。我们可以通过`Class`对象来获取关于任何类的信息,包括它的构造器、方法、字段等。例如,`Class.forName("全限定...
本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象特性。 1. **类与对象**:Java中的基本构建块是类,它代表了现实世界中的事物或概念。对象则是类的实例,具有类定义的属性和行为...
Java 反射是 Java 程序设计语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说 "自审 ",并能直接操作程序的内部属性。Java 反射的能力在实际应用中非常有价值,例如,使用它能获得 Java 类中各成员的...
本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性如何在实际编码中体现。 ### 多态性概述 多态性主要通过方法的重写(Overriding)、重载(Overloading)和动态绑定(Dynamic Binding)来...
2. **获取类信息**:一旦获得`Class`对象,我们就能获取类的元数据,包括类名、修饰符(public、private等)、父类、接口、字段和方法等。例如,`getClassName()`返回类名,`isInterface()`判断是否为接口,`...
在Java编程语言中,"父类引用指向子类对象"是一种常见的多态性表现,它体现了面向对象设计的核心原则之一。这种现象发生时,父类类型的引用被用来创建和操作子类的对象,允许我们利用子类扩展的功能,同时保持代码的...