java - Java-来自静态初始化块内部的类类型

是否可以从静态初始化块内部获取类类型?
这是我目前的简化版本:

class Person extends SuperClass {

   String firstName;

   static{
      // This function is on the "SuperClass":
      //  I'd for this function to be able to get "Person.class" without me
      //  having to explicitly type it in but "this.class" does not work in 
      //  a static context.
      doSomeReflectionStuff(Person.class);     // IN "SuperClass"
   }
}

这更接近于我所做的工作,即初始化一个数据结构,该结构保存有关对象及其注释等的信息。也许我用错了模式?
public abstract SuperClass{
   static void doSomeReflectionStuff( Class<?> classType, List<FieldData> fieldDataList ){
      Field[] fields = classType.getDeclaredFields();
      for( Field field : fields ){
         // Initialize fieldDataList
      }
   }
}

public abstract class Person {

   @SomeAnnotation
   String firstName;

   // Holds information on each of the fields, I used a Map<String, FieldData>
   //  in my actual implementation to map strings to the field information, but that
   //  seemed a little wordy for this example
   static List<FieldData> fieldDataList = new List<FieldData>();

   static{
      // Again, it seems dangerous to have to type in the "Person.class"
      //   (or Address.class, PhoneNumber.class, etc...) every time.
      //   Ideally, I'd liken to eliminate all this code from the Sub class
      //   since now I have to copy and paste it into each Sub class.
      doSomeReflectionStuff(Person.class, fieldDataList);
   }
}

编辑
我选择了一个公认的答案,基于什么最适用于我的问题,但在我看来,目前的三个答案都有其优点。

最佳答案

不,不抓取stacktrace是不可能的(这比你最初的方法更糟糕,我更喜欢上面的Thread#getStackTrace())。
而是在检查new Exception()状态的抽象类的非静态初始值设定项(或默认构造函数)中执行该操作。

public abstract class SuperClass {

    {
        if (!isInitialized(getClass())) {
            initialize(getClass());
        }
    }

}

依次调用的方法可以安全地initialized

本文翻译自 https://stackoverflow.com/questions/2944972/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java reflection static-initializer static-initialization


相关文章:

java - 无法通过代理隧道。代理返回“需要HTTP / 1.1 407代理授权”

java - 使用post方法将android app连接到webserver

c++ - .crt部分?这个警告意味着什么?

c# - 静态类中静态字段的初始化顺序

java - 无法在try / catch中初始化静态最终变量

java - 将byte []数组的元素组合成16位数字

java - 带Singleton的OnSaveInstanceState

c# - C#对当前异步方法的反思

java - 通用列表属性,获取通用类型

c# - 如何获得带有反射的字符串形式的C#属性名称? [重复]