静的コンテキストからクラス名を使用せずにJavaでの.classオブジェクトにアクセスする方法

Spyros K:

Javaでは、(つまりタイピングの)クラスの名前を使用しなくてもクラスにアクセスすることが可能です。

public class Example {

    /**
     * Non static context, can only be called from an instance.
     */
    public void accessClass() {
        System.out.println(this.getClass());
    }

}

しかし、静的な文脈で全く同様の方法だけの.class静的フィールドはありません。この質問はない他のクラスから、Javaクラス自体の中から.classファイルへのアクセスに焦点を当てています。

public class Example2 {
    //field used to demonstrate what is meant by "indirectly referencing the class name.
    private static Class<Example2> otherClass = Example2.class;
    private static int intField = 1;
   /**
     * Non static context, can only be called from an instance.
     */
     public static void accessClass() {

        // The .class static field can be accessed by using the name of the class
        System.out.println(Example2.class);

        // However the following is wrong
        // System.out.println(class);

        // Accessing static fields is in general possible
        System.out.println(intField);

        // Accessing a static field of the same Class is also possible, but does not satisfy the answer since the class name has been written in the declaration of the field and thus indirectly referenced.
        System.out.println(otherClass);

    }

}

アクセスする方法がある.class(いずれも直接的にも間接的に)クラス名を参照することなく、同じクラスの静的コンテキストからクラスのオブジェクトは?

別の制限は、答えは、クラスをインスタンス化または使用することを許可されていないことである.getClass()インスタンスメソッドを。

私は私の調査結果を実証すること試して上記の例をいくつか作成しました。私は、私がアクセスする方法を見つけることができなかったことを通知に驚いた.class同じクラス内からクラス名を入力せずにフィールドを。

これは、いくつかの設計上の決定の単なる副作用であるか、アクセスがいることを何らかの根本的な理由がある.classクラス名なしで可能ではありませんか?

ハルク:

使用して、Java 9アプローチStackWalkerAPIを

Class<?> currentClass = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
        .walk(s -> s.map(StackFrame::getDeclaringClass).findFirst().orElseThrow());

このアプローチは、完全クラス名を使用して回避します。


whisは、コア言語の機能ではありません理由については、私は推測することができますが、私の心に来る一つのことは、いくつかのキーワードを通じて、このような機能を実装する複雑にネストされたクラスの周りのいくつかの合併症です。それはなど、ネストされたクラスの中から、場合によっては複数の外側のクラスを参照する方法せずにこれを追加するにはあまり意味がありません

もう一つの理由は、これは非常に有用ではないということである - これは私が今まで見逃している機能ではありません。今日のIDEやその強力なリファクタリングツールを使用すると、クラス名を使用すると、クラスが、後に名前が変更された場合でも、非常に問題ではありません。ソースコードを生成する場合であっても、クラス名を代入することは比較的簡単です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=232706&siteId=1