リライト: Javaクラスを参照するにはどのような方法がありますか?

PHPz
リリース: 2023-05-10 09:28:08
転載
1175 人が閲覧しました

1. クラスのアクティブ参照により、必ずクラスの初期化が発生します。 仮想マシンが起動したら、まず main メソッドが配置されているクラスを初期化します

クラスのオブジェクトをインスタンス化します

クラスの静的メンバー (最後の定数を除く) を呼び出し、静的メソッド

java.lang.reflect パッケージのメソッドを使用して、クラスへのリフレクション呼び出しを行います

#クラスを初期化するとき、その親クラスが初期化されていない場合は、その親クラス最初に初期化されます

2. クラスの受動的参照、クラスの初期化は発生しません

静的フィールドにアクセスする場合、これを実際に宣言するクラスのみがアクセスされますフィールドが初期化されます。例: 親クラスの静的変数がサブクラスを通じて参照される場合、サブクラスは初期化されません

配列を通じてクラス参照を定義しても、このクラスの初期化はトリガーされません

参照定数は、このクラスの初期化をトリガーしません (定数はリンクフェーズ中に呼び出し側クラスの定数プールに格納されます)

Example

package com.volcano.reflection;
//什么时候会发生类的初始化,除了第一个注释一直开着,其他都要独立打开测试,否则不准确
public class TestReflection3 {
    static {
        //1.虚拟机启动就会最先初始化main方法所在的类 会
        System.out.println("main方法被加载");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //2.实例化一个对象 会
        //new Father();
        //3.调用类的静态成员(除了final常量)和静态方法 会
        //System.out.println(Son.a);
        //4.使用java.lang.reflect包的方法对类进行反射调用 会
        //Class cls = Class.forName("com.volcano.reflection.Father");
        //5.当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 会
        //new Son();
 
        //6.当访问一个静态域时,只有真正声明这个域的类才会被初始化 不会
        //System.out.println(Father.a);//两个都是只加载Father
        //System.out.println(Son.a);//因为a是Father的静态成员
        //7.通过数组定义类引用,不会触发此类的初始化 不会
        //Father[] fathers = new Father[10];
        //8.引用常量不会触发此类的初始化 不会
        //System.out.println(Father.B);
 
    }
}
class Father{
    static {
        System.out.println("Father被加载");
    }
    static int a=100;
    static final int B = 300;
}
class Son extends Father{
    static {
        System.out.println("Son被加载");
    }
    static int c=200;
 
}
ログイン後にコピー

以上がリライト: Javaクラスを参照するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート