Java Road to God:Javaインタビューの準備(11)

10.注釈と反映

10.1リフレクションの概念と機能

リフレクションの概念:

リフレクション、コンピューター処理方法。これは、プログラムが自身の状態または動作にアクセス、検出、および変更する機能です。

Javaリフレクションは実行時にロードでき、コンパイル中に完全に不明なクラスを検出して使用できます。

プログラムの実行中は、名前だけでクラスを動的にロードできます。ロードされたクラスについては、このクラスのすべてのプロパティとメソッドを知ることができます。オブジェクトについては、そのメソッドとプロパティを呼び出すことができます。

クラスがロードされると、ヒープメモリにClass型のオブジェクトが生成されます(クラスにはClassオブジェクトが1つだけあります)。このオブジェクトにはクラスの完全な構造情報が含まれ、Classオブジェクトはミラーのようなものです。このミラー。クラスの構造に対して、それはリフレクションと呼ばれます。

Javaリフレクションを使用すると、プログラムの実行中にクラスを動的にロードし、クラスの基本情報と定義されたメソッド、コンストラクター、ドメインなどを動的に取得できます。

クラス情報の確認に加えて、クラスインスタンスを動的に作成し、クラスインスタンスのメソッドを実行し、クラスインスタンスのドメイン値を取得することもできます。リフレクションは、Javaの静的言語に動的な特性を与えます。

リフレクションの役割:

リフレクションを通じて、プログラムコードはJVMにロードされたクラスの内部情報にアクセスできます

  1. ロードされたクラスの属性情報を取得します

  2. ロードされたクラスを取得するメソッド

  3. ロードされたクラスの構築メソッドに関する情報を取得します

リフレクションの利点:

プログラムの柔軟性を高めます。

ストラットなど。ディスパッチ制御を要求しました。

リクエストが来たとき。クエリ構成ファイルを調べます。リクエストに対応するアクションを見つけます。すでにメソッド。

次に、リフレクションを通じてアクションをインスタンス化します。そして、応答メソッドを呼び出します。

リフレクションが適用できない場合は、コードにのみ書き込むことができます。

したがって、一方は柔軟性があり、もう一方は柔軟性がありません。

リフレクションを使用する必要はめったにありません。ほとんどの場合、振り返りはプログラムの柔軟性を向上させることです。したがって、一般的なフレームワークでより多く使用されます。フレームワークはより多くの状況に適用可能でなければならないからです。柔軟性に対する高い要件。

10.2 Javaリフレクションテクノロジーの主な実装クラスとその役割は何ですか?

JDKでは、Javaリフレクションメカニズムは主に、java.lang.reflectパッケージにある次のクラスによって実装されます。

1)クラスクラス:クラスを表します

2)フィールドクラス:クラスを表すメンバー変数(属性)

3)メソッドクラス:代表クラスのメンバーメソッド

4)コンストラクタークラス:代表クラスの構築方法

5)配列クラス:配列を動的に作成し、配列の要素にアクセスするための静的メソッドを提供します

10.3クラスの役割はですか?クラスオブジェクトを生成するメソッドは何ですか

Classクラスは、Javaリフレクションメカニズムの起点およびエントリポイントであり、クラスに関連するさまざまな情報を取得するために使用され、クラス情報を取得するための関連メソッドを提供します。クラスクラスはオブジェクトクラスから継承します

クラスクラスは、すべてのクラスに共通の図面です。各クラスには、図面と物理オブジェクトの関係など、独自のオブジェクトがあります。各クラスは、クラスの構造情報を格納し、次の方法で対応する情報を取得できる共通の図面クラスを使用して、オブジェクトと見なすこともできます。対応するメソッド:クラスの名前、プロパティ、メソッド、コンストラクター、親クラス、およびインターフェイス

10.4リフレクションの機会と機能、およびその長所と短所を使用する

1)使用機会

コンパイル時には、オブジェクトまたはクラスがどのクラスに属しているかを知ることはできません。プログラムは、実行時情報のみに依存して、オブジェクトおよびクラスの真の情報を検出します。

2)主な機能

リフレクションにより、プログラムコードは、JVMにロードされたクラスの内部情報にアクセスし、ロードされたクラスの属性情報を取得し、ロードされたクラスのメソッドを取得し、ロードされたクラスの構築メソッド情報を取得できます。

3)リフレクションの利点

リフレクションは、Javaプログラムの柔軟性とスケーラビリティーを改善し、結合を減らし、適応機能を改善します。これにより、プログラムは、ターゲットクラスを事前にハードコーディングしなくても、任意のクラスのオブジェクトを作成および制御できます。リフレクションは、C、C ++、Fortran、Pascalなどの他の一般的な言語では使用できません。

4)Javaリフレクションテクノロジーには、ソフトウェアテストなどの幅広いアプリケーションがあります。Struts、Hibernate、Springなどの多くの一般的なオープンソースフレームワークは、実装プロセスでこのテクノロジーを採用しています。

5)リフレクションのデメリット

パフォーマンスの問題:リフレクションの使用は基本的に解釈操作であり、フィールドおよびメソッドへのアクセスに使用する場合、直接コードよりもはるかに低速です。したがって、Javaリフレクションメカニズムは、主に高い柔軟性とスケーラビリティを必要とするシステムフレームワークで使用され、通常のプログラムには推奨されません。

リフレクションを使用すると、プログラムの内部ロジックが不明瞭になります。プログラマーは、ソースコードでプログラムのロジックを確認する必要があり、リフレクションやソースコードをバイパスするその他のテクノロジは、メンテナンスの問題を引き起こします。リフレクションコードは、対応する直接コードよりも複雑です。

10.5 Javaのリフレクションの原則とアノテーションの原則?

リフレクションの原則:JVMは、バイトコードクラスファイルを介して対応するオブジェクトを生成します。オブジェクトの通常の生成と同様に、すべてバイトコードクラスファイルから派生します。リフレクションと呼ばれる理由は、A a = new A()などの通常のオブジェクト宣言とは異なるためです。

10.6 class.forName( "java.lang.String")とString.class.getClassLoader()。loadClass()の違いは何ですか

10.7シングルトンパターンが反射によって破壊されるのを防ぐ方法

public class DemoModify {
    
    
    
    private static boolean flag = true;
    
    private  DemoModify() {
    
    
        synchronized (DemoModify.class) {
    
    
            if (flag == false) {
    
    
                flag = !flag;
            }else{
    
    
                throw new RuntimeException("单例模式被侵犯!");
            }
        }
    }
    
    //静态内部类
    private static class SingletonHolder{
    
    
        private static final DemoModify INSTANCE = new DemoModify();
    }
    
    public static DemoModify getInstance(){
    
    
        return SingletonHolder.INSTANCE;
    }
}

10.8Javaのメタアノテーション

注釈の変更

@Target :定义自定义注解的使用范围
-类
-方法
-属性

@Retention: 定义自定义注解的生效时间
-source 只保留在源文件,编译成class文件后此注解没有
-class 检查性操作,比如@Supperesswaring
-runtime 

@Documented:生成javadoc信息

@Inherited:修饰的自定义注解可以被子类继承 

11.Javaのキーワード

11.1これとスーパーキーワードの役割

これはオブジェクト自体の内部参照であり、メンバー変数とローカル変数の同じ名前の問題も解決します。これはメンバー変数を呼び出すことはできますが、ローカル変数を呼び出すことはできません。これはメンバーメソッドを呼び出すこともできますが、では省略できます。通常の方法、構築方法では省略は許可されていません。構築方法の最初のステートメントである必要があります。、およびこのキーワードは静的メソッドでは許可されていません。

superは、現在のオブジェクトの直接の親クラスオブジェクトへの参照を表し、superは直接の親クラスのメンバー変数を呼び出すことができます(プライベートメンバーにアクセスできないなどのアクセス許可修飾子の影響に注意してください)

Superは、直接の親クラスのメンバーメソッドを呼び出すことができます(プライベートメンバーにアクセスできないなど、アクセス許可修飾子の影響に注意してください)。superは、構築でのみ使用できる直接の親クラスのコンストラクターを呼び出すことができます。メソッドであり、最初のステートメントである必要があります。

11.2静的キーワードの役割

staticは、変数、メソッド、コードブロック、および内部クラスを変更できます

静的属性はこのクラスに属します。つまり、このクラスによって作成されたすべてのオブジェクトは同じ静的属性を共有します。オブジェクトの作成後、オブジェクト名、属性名、クラス名、属性名の2つの方法でアクセスできます。オブジェクトを作成する前に、クラス名と属性名を使用してアクセスすることもできます。

静的変数と非静的変数の違い(どちらもメンバー変数であり、ローカル変数ではありません)

1.メモリ内のコピー数が異なります

オブジェクトがいくつあっても、静的変数は1つだけです。オブジェクトごとに、インスタンス変数の個別のコピーがあります

静的変数はクラス全体に属し、クラス変数とも呼ばれます。非静的変数は、インスタンス変数とも呼ばれるオブジェクトに属します

2.メモリ内のさまざまな場所

2.メモリ内のさまざまな場所

3.さまざまなアクセス方法

インスタンス変数:オブジェクト名。変数名stu1.name = "Xiao Mingming";

静的変数:オブジェクト名。変数名stu1.schoolName = "Xi'erqi小学校";このような使用はお勧めしません

クラス名。変数名Student.schoolName = "Dongsanqi小学校";推奨

4.メモリにスペースを割り当てる時間は異なります

Student.schoolName = "Dongsanqi小学校";またはStudentstu1 = new Student( "小明"、 "男"、20,98);

静的メソッドには、オブジェクト名、メソッド名、クラス名の2つの方法でアクセスすることもできます。メソッド名

静的コードブロック。クラスを初めて使用するとき(静的プロパティとメソッドの呼び出し、またはそのオブジェクトの作成など)、静的コードブロックが実行され、1回だけ実行されます。主な機能は、静的の初期化を実現することです。プロパティ。

静的内部クラス:外部クラスに属するすべてのオブジェクトではなく、外部クラス全体に属します。外部クラスの非静的メンバー(変数またはメソッド)にアクセスできず、外部クラスの静的メンバーにアクセスできます

11.3最終キーワードと抽象的なキーワードの役割

Finalとabstractは、機能が逆の2つのキーワードであり、比較して記憶することができます。

抽象はクラスとメソッドの変更に使用できますが、属性と構築メソッドの変更には使用できません。抽象で変更されたクラスは抽象クラスであり、継承する必要があります。抽象で変更されたメソッドは抽象メソッドであり、サブクラスでオーバーライドする必要があります。

Finalは、クラス、メソッド、および属性を変更するために使用できますが、コンストラクターは変更できません。finalで変更されたクラスは継承できず、finalで変更されたメソッドはオーバーライドできず、finalで変更された変数の値は変更できないため、定数になります。

*特別な注意:* finalは基本型変数を変更します。その値は元の変数から定数に変更できません。finalは参照型変数を変更します。スタックメモリ内の参照は変更できませんが、オブジェクトの属性は値が指しているヒープメモリは引き続き変更できます。例えば

class Test {
    
    
    public static void main(String[] args) {
    
    
        final Dog dog = new Dog("欧欧");
        dog.name = "美美";//正确
        dog = new Dog("亚亚");//错误
    }
}

11.4ファイナル、ファイナル、ファイナライズの違い

Final修飾子(キーワード)クラスがfinalとして宣言されている場合、それは新しいサブクラスを派生できなくなり、親クラスとして継承できないことを意味します(例:Stringクラス、Mathクラスなど)。変数またはメソッドをfinalとして宣言すると、使用中に変更されないことが保証されます。finalとして宣言された変数は、宣言時に初期値を指定する必要があり、後続の参照でのみ読み取ることができ、変更することはできません。finalとして宣言されたメソッドも使用のみ可能で、オーバーライドすることはできませんが、オーバーロードすることはできます。最終的に変更されたオブジェクトを使用すると、オブジェクトの参照アドレスは変更できませんが、オブジェクトの値は変更できます。

最後に、クリーンアップ操作を実行するために、例外処理中にfinallyブロックが提供されます。最終的に存在する場合、例外が発生したかどうかに関係なく、finallyステートメントが実行されます。通常の状況では、物理接続(IOストリーム、データベース接続、ソケット接続)を閉じるなど、関連するすべての操作がこのコードブロックに入れられます。

メソッド名を確定します。Javaテクノロジでは、finalize()メソッドを使用して、ガベージコレクタがオブジェクトをメモリからクリアする前に必要なクリーンアップ作業を実行できます。ガベージコレクターによってオブジェクトが削除される前に、finalize()メソッドが呼び出されます。Objectクラスで定義されているため、すべてのクラスが継承します。サブクラスはfinalize()メソッドをオーバーライドして、システムリソースを整理したり、その他のクリーンアップタスクを実行したりします。通常の状況では、このメソッドはJVMによって呼び出されます。プログラマーは、このメソッドを呼び出さないでください。

11.5変数がfinalで変更された場合はどうなりますか?メソッドが最終的に変更された場合はどうなりますか

1. finalで変更されたクラスは拡張できません。つまり、サブクラスはありません。

2. finalで変更されたメソッドは、置き換えたり非表示にしたりすることはできません。

①最終変更を使用するインスタンスメソッドは、それらが属するクラスのサブクラスでオーバーライドできません。

②finalで変更された静的メソッドを再定義して、それが属するクラスのサブクラスに非表示にすることはできません。

3. finalで変更された変数は、最大で1回しか割り当てることができず、変数のタイプが異なれば、割り当て方法がわずかに異なる場合があります。

①静的変数は(型のデフォルト値だけでなく)一度確実に割り当てる必要があります。クラスメンバーの静的変数として、初期化式を介した宣言または静的初期化ブロックで割り当てることができます。静的インターフェイスメンバー変数として、割り当ては宣言内の初期化式を介してのみ実行できます。

②インスタンス変数も(型のデフォルト値だけでなく)一度確実に割り当てる必要があります。割り当ては、初期化式を介した宣言、またはインスタンス初期化ブロックまたはコンストラクターで行うことができます。

③メソッドパラメータ変数は、メソッドが呼び出されたときに作成され、同時に対応する実際のパラメータ値に初期化され、メソッド本体の最後で終了します。この間、その値を変更することはできません。

④コンストラクターパラメーター変数は、コンストラクターが呼び出されたときに作成され(インスタンス作成式または表示されたコンストラクター呼び出しを介して)、同時に初期化されます。これらは対応する実際のパラメーター値であり、コンストラクター本体の最後で終了します。この間期間、それらの値は変更できません。;

⑤例外ハンドラパラメータ変数は、tryステートメントのcatch句で例外がキャッチされると同時に作成され、同時に実際の例外オブジェクトに初期化され、catchステートメントブロックとその値の最後で終了します。この期間中は変更できません。

⑥ローカル変数は、その値にアクセスする前に確実に割り当てる必要があります。

おすすめ

転載: blog.csdn.net/weixin_54707168/article/details/113976596