当前位置: 首页 > 面试题库 >

Java反射-访问保护字段

池恩
2023-03-14
问题内容

如何通过反射访问对象的继承保护字段?


问题答案:

您可能会遇到两个问题-字段可能无法正常访问(私有),并且不在您正在查看的类中,而是位于层次结构中的某个位置。

这样的事情甚至可以解决这些问题:

public class SomeExample {

  public static void main(String[] args) throws Exception{
    Object myObj = new SomeDerivedClass(1234);
    Class myClass = myObj.getClass();
    Field myField = getField(myClass, "value");
    myField.setAccessible(true); //required if field is not normally accessible
    System.out.println("value: " + myField.get(myObj));
  }

  private static Field getField(Class clazz, String fieldName)
        throws NoSuchFieldException {
    try {
      return clazz.getDeclaredField(fieldName);
    } catch (NoSuchFieldException e) {
      Class superClass = clazz.getSuperclass();
      if (superClass == null) {
        throw e;
      } else {
        return getField(superClass, fieldName);
      }
    }
  }
}

class SomeBaseClass {
  private Integer value;

  SomeBaseClass(Integer value) {
    this.value = value;
  }
}

class SomeDerivedClass extends SomeBaseClass {
  SomeDerivedClass(Integer value) {
    super(value);
  }
}


 类似资料:
  • 假设我有几个这样的类: 我想迭代所有包含的子类(不是继承的),并获得嵌套对象树中所有字段的列表。但是,当我使用这样的反射代码时: 在“do somethine here”步骤中,我想访问myField的子字段,但在Field api中没有看到任何直接允许我这样做的内容。我试过: MyField.getDeclaringClass(). getDeclaredFields()- 和 MyField.

  • 问题内容: 我有一个可通过HTTP访问的简单Web API,一些相应的移动应用程序正在读取该数据。现在有人反编译了一个应用程序/嗅探了HTTP流量,将URL转到了我的Web API,并建立了自己的客户端,就像我的客户端一样。 如何确保仅我自己的客户对API的访问权限?即使想到有人在反编译我的应用程序。 服务器和客户端代码更改是一个选择! 问题答案: 服务器和客户端代码更改是一个选择! 首先,您无法

  • 问题内容: 我想了解以下示例中的情况(通过包从子类外部访问受保护的成员)。 我知道对于包外部的类,子类只能通过继承才能看到受保护的成员。 有两个包:和。 : : : 可以理解,中的方法可以访问,因为受保护的成员只能通过继承来访问。 我的问题是,为什么是方法,通过在基准访问时,工作正常的方法 ,但 将无法正常工作 通过访问时的参考? 问题答案: 该类中的代码被允许通过type的引用访问受保护的成员。

  • 问题内容: 我目前正在研究Java安全性,并遇到了一个奇怪的现象。Java中的SecurityManager存储在java.lang.System中的“ security”字段中。有趣的是,该领域似乎受到了防止反射访问的保护,这确实是有道理的,但是据我所知,该领域是唯一的领域。因此,这是示例: 输出 有趣的是:该字段声明为 不在列表中,并且确定有足够的呼叫 产生NoSuchFieldExcepti

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • JDK11+spring批处理 有人知道那些警告是什么意思吗: 警告:发生了非法的反射访问操作警告:org.springframework.cglib.core.reflectutils$1(jar:file:/users/boru/downloads/spcljr/build/libs/spcljr-0.0.1-snapshot.jar!/boot-inf/lib/spring-core-5.0