`

java 反射 getDeclaredField和getField的区别

 
阅读更多
getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.


 public Field getDeclaredField(String name)
        throws NoSuchFieldException, SecurityException {
        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
        Field field = searchFields(privateGetDeclaredFields(false), name);
        if (field == null) {
            throw new NoSuchFieldException(name);
        }
        return field;
    }


private Field getField0(String name) throws NoSuchFieldException {
        Field res = null;
        // Search declared public fields
        if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {
            return res;
        }
.......


getField其实调用的是getField0.
他们最后都调用了searchFields.
不过getDeclaredField传入的是privateGetDeclaredFields(false),
getField传入的是privateGetDeclaredFields(true),



 private Field[] privateGetDeclaredFields(boolean publicOnly) {
        checkInitted();
        Field[] res = null;
        if (useCaches) {
            clearCachesOnClassRedefinition();
            if (publicOnly) {
                if (declaredPublicFields != null) {
                    res = (Field[]) declaredPublicFields.get();
                }
            } else {
                if (declaredFields != null) {
                    res = (Field[]) declaredFields.get();
                }
            }


可以看到传入条件为true的时候使用的是declaredPublicFields,意思是public字段
为false的时候使用的是declaredFields.

当然declaredFields和declaredPublicFields最终的来源是

 private native Field[]       getDeclaredFields0(boolean publicOnly);


可惜这是个native方法.感觉java就是很无奈,发现都是native方法档在路上.

分享到:
评论

相关推荐

    java反射 java反射 java反射java反射

    总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。

    北大青鸟java反射机制

    我们可以使用`getFields()`或`getField(String name)`来获取类的公共字段,或者使用`getDeclaredFields()`和`getDeclaredField(String name)`获取所有字段(包括私有和受保护的)。一旦获取了Field对象,我们就可以...

    java例子 java反射

    在给出的“JavaClass”示例中,可能包含了一个或多个展示如何使用Java反射的代码片段,可能涉及到创建`Class`对象、获取和调用方法、访问字段等内容。通过分析这些例子,你可以更深入地理解Java反射的使用方式及其在...

    java反射的demo代码

    Java反射是Java编程语言中的一个强大特性,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型、插件系统、序列化、元数据处理以及许多其他...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    java反射实例代码

    Java反射是Java编程语言中的一个重要特性,它允许运行时的程序访问、操作和修改自身的行为。这个特性使得Java具有了动态性,可以实现元编程,即在程序运行时检查类的信息,创建和调用对象的方法,甚至修改类的结构。...

    JAVA 反射机制应用

    - 使用getField()、getDeclaredField()获取字段,并通过set()和get()方法设置和获取字段值。 3. **Method类** - Method对象表示类的方法,包括静态方法和实例方法。 - 使用getMethods()获取公共方法,...

    java反射.pdf

    Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...

    Java反射机制源码

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这为实现元编程和框架设计...

    java反射调用实例代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种...

    java反射实例

    例如,`Class.getMethod()`和`Class.getField()`可以分别用来获取指定的公共方法和字段,而`Class.getDeclaredMethod()`和`Class.getDeclaredField()`则可以获取包括私有在内的所有方法和字段。 `java.lang.reflect...

    java反射深入剖析(推荐)

    1. 访问和修改字段:`Field`类代表类的字段,可以使用`getField()`、`getDeclaredField()`获取,然后调用`set()`和`get()`方法进行访问和修改。 2. 调用方法:`Method`类代表类的方法,通过`getMethod()`、`...

    java反射机制PPT

    Java反射机制是Java编程语言中一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象...

    java 反射的使用

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...

    java反射原理详解

    总之,Java反射机制提供了一种强大而灵活的方式来探索和操纵类的结构和行为,使程序具有更高的动态性。然而,使用反射时需权衡其带来的安全性和性能损失,确保在必要时使用,并合理控制其范围。

    Java反射机制(推荐)

    `getField()`方法获取公共字段,`getDeclaredField()`获取所有字段,包括私有和受保护的。`set()`和`get()`方法分别用于设置和获取字段值。 6. **构造器的使用**:Constructor类代表类的构造器,`getConstructor()`...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    最全面的java反射总结

    总的来说,Java反射机制提供了一种强大的机制,使得程序在运行时能够获取和修改类的信息,极大地增强了Java的灵活性和可扩展性。然而,使用反射时应充分理解其原理,权衡其带来的便利和可能的风险。

    Java 反射详解

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等对象,即使这些对象在编译时并未被明确地引用。这一特性使得Java具有高度的动态性,使得代码能够在运行时检查类的信息...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。

Global site tag (gtag.js) - Google Analytics