Java ネットワーク プログラミング_リフレクション

UDPネットワーク通信の契約送信処理

  • DatagramSocket() を使用してパケット ソケットを作成します。
  • DatagramPacket(byte[]buf, int offset, int length, InetAddress address, int port) を使用して、送信するパケットを作成します。
  • DatagramSocketクラスのsend()メソッドデータパケットを使用します。

UDPネットワーク通信の受信処理

  • DatagramSocket(int) を使用して、指定されたポートにバインドされたデータグラム ソケットを作成します。
  • DatagramPacket(byte[]buf, int length) を使用して、パケットを受信するバイト配列を作成します。
  • UDPを受信するにはDatagramSocketクラスのreceive()メソッドを使用します。

取得したデータは実際には空のパッケージを作成する配列に格納されるため、表示変換時に長さを設定することを推奨 System.out.println
(dp.getLength()); //データの具体的な長さ
String str =new String(buffer,0, dp.getLength());

一般的に、UDP プロトコルの最大パケット長は 64k です。

マルチキャストまたはマルチキャストの実装

(リアルチャットルームの実現原理)

  • マルチキャストはルータをベースに実装されており、ネットワーク内でマルチキャストをサポートするには、マルチキャストグループを管理できるルータまたはレイヤ3スイッチ(部分的なルーティング機能を持つスイッチ)が必要です。通常、私たちのネットワークではマルチキャストがサポートされています。つまり、私たちのプログラムはマルチキャスト技術を使用でき、ビデオ会議はこの技術を使用します。

  • IP ネットワーク上のマルチキャストは、通常、マルチキャスト IP アドレスを通じて実装されます。マルチキャスト IP アドレスはクラス D IP アドレス、つまり 224.0.0.0 ~ 239.255.255.255 の IP アドレスです。通常、230 以降のアドレスを選択し、UDP プロトコルを使用し、各クライアント (受信側と送信側) のソケットをこのアドレスに追加します。その後、クライアントはこのアドレスにメッセージを送信します。このグループ内の他のクライアントは、両端でリッスンできます。このメッセージを受け取ります。

  • JavaではDatagramSocketのサブクラスであるjava.net.MulticastSocketがマルチキャスト機能を持っています。MulticastSocket は、指定されたグループに参加しているすべてのクライアントにデータグラムをブロードキャストできます

  • マルチキャストとは、情報を宛先アドレスのグループに同時に送信することを指します。メッセージは各ネットワーク リンク上で 1 回だけ配信する必要があり、メッセージはリンクが分岐するときにのみ複製されるため、使用する戦略が最も効率的です。マルチキャストとは対照的に、通常のポイントツーユニポイント配信はユニキャストと呼ばれます。ユニキャストで複数の受信者にメッセージを配信する場合、データのコピーを各受信者に送信する必要があります。結果として冗長なレプリカが作成されると、送信側の効率が低下し、スケーラビリティが欠如します。ただし、XMPP などの多くの一般的なプロトコルは、受信者の数を制限することでこの欠点を補っています。

プロキシサーバーの使用

JDK1.5 は、プロキシ アクセスを実装するための Proxy クラスと ProxySelector クラスを提供します。

Proxy はプロキシ サーバーを表します。URLConnection 接続を開くときにプロキシを指定することも、Socket 接続を作成するときにプロキシを指定することもできます。

ProxySelector は、プロキシ サーバーをより柔軟に制御するプロキシ セレクターで、http\https\ftp\socket を個別に設定できるほか、プロキシ サーバーを経由する必要のないホストやアドレスも設定できます。

プロキシサーバーの機能:

  • 独自の IP 制限を突破する
  • アクセス速度の向上

反射

Java リフレクション メカニズムを使用すると、プログラムは、実行時にリフレクション API を介して、修飾子 (public、static など)、スーパークラス (Object など)、実装されたインターフェイス (オブジェクトなど) を含む、既知の名前を持つ任意のクラスの内部情報を取得できます。シリアル化可能)、フィールド (属性)、およびメソッド (メソッド) (メソッド定義は含まない)、フィールドの内容は実行時に変更でき、メソッドを呼び出すこともできます。

アドバンテージ:

  • 実行時にクラスのさまざまなコンテンツを取得し、逆コンパイルを実行します。Java のように、コンパイルしてから実行する言語の場合、コンポーネント間のソース コードを使用せずに、実行時にこれらのコードを組み立てることができる、柔軟なコードを作成するのに非常に便利です。 、オブジェクト指向の実装が容易になります。

欠点:

  • リフレクションは特定のシステム リソースを消費するため、オブジェクトを動的に作成する必要がない場合は、リフレクションを使用する必要はありません。
  • メソッドがリフレクションによって呼び出される場合、権限チェックは無視される可能性があるため、カプセル化が破壊され、セキュリティ上の問題が発生する可能性があります。

反射の使用

  • 逆コンパイル:.class-->.java
  • リフレクションメカニズムを通じて Java オブジェクトのプロパティ、メソッド、コンストラクターなどにアクセスします
  • Ecplise などの IDE を使用する場合、オブジェクトまたはクラスを入力してそのプロパティとメソッドを呼び出したいときにドットを押すと、コンパイラが自動的にそのプロパティまたはメソッドをリストします。ここではリフレクションが使用されます。
  • リフレクションの最も重要な用途は、さまざまな一般的なフレームワークを開発することです。たとえば、Spring の多くのフレームワークは構成可能です (XML ファイルを使用して Bean を構成するなど)。フレームワークの汎用性を確保するには、構成ファイルに従ってさまざまなクラスまたはオブジェクトをロードし、さまざまなメソッドを呼び出す必要がある場合があります。実行時にロードする必要があるオブジェクトを動的にロードします。
    • MyBatis 永続層フレームワーク Spring ビジネス層フレームワーク SpringMVC プレゼンテーション層フレームワーク

動的にクラス情報を取得し、動的にオブジェクトを呼び出す方法をJavaのリフレクションReflection機構といいます。

リフレクションは、アセンブリ、モジュール、および型をカプセル化するオブジェクトを提供します。Java 実行環境では、任意のクラスのオブジェクトについて、そのクラスの情報をリフレクションによって取得できます。

Class クラスは、Reflection API のコア クラスです。

主に以下のような方法があります。

  • getName(): java.util.Date などのクラスの名前を取得します。

  • getFields(): クラス内のパブリック型のプロパティを取得し、親クラスからカスタマイズまたは継承します。

  • getDeclaredFields(): クラスのすべての属性 (public、protected、default、private を含む) を取得します。現在のクラス定義のみを取得でき、親クラスの継承は取得できません。

  • getMethods(): クラス内のパブリック型のメソッドを取得する

  • getDeclaredMethods(): クラスのすべてのメソッドを取得します

  • getMethod(String name,Class[]parameterTypes): クラスの指定されたメソッドを取得します。 name: 指定されたメソッドの名前、parameterType: 指定されたメソッドのパラメータの型

  • getDeclaredメソッド

  • getConstrtors(): クラス内のパブリック型のコンストラクターを取得します。

  • getDeclaredConstructors()

  • getConstrutor(Class[]parameterTypes): クラスの指定されたコンストラクターを取得します。parameterTypes: コンストラクターのパラメーターの型を指定します。

  • getDeclaredConstructor

  • newInstance(): パラメータなしでクラスのパブリック構築メソッドを通じてこのクラスのオブジェクトを作成します;
    @Deprecated(since="9")

注: プライベート プロパティおよびプライベート メソッドにアクセスする場合、アクセスされたプライベート プロパティまたはメソッドに setAccessible(true) を設定して、リフレクトされたクラスが Java アクセス チェック メカニズムを抑制するようにする必要があります。それ以外の場合は、IllegalAccessException が報告されます。

反射の使用

リフレクション メカニズムを使用する場合は、まずこのクラスのバイトコード ファイル オブジェクト (.class) を取得する必要があります。バイトコード ファイル オブジェクトを通じて、このクラスのメソッド (メソッド、属性、クラス名、親クラス名、実装されたすべてのインターフェイスなど)、各クラスはバイトコード ファイルに対応し
、バイトコード ファイルはクラス型オブジェクト、つまりバイトコード ファイル オブジェクトに対応します。

バイトコード ファイル オブジェクトを取得する 3 つの方法:
  • Class clazz1 = Class.forName("完全修飾クラス名");  
    Class クラスの静的メソッド forName を通じて、クラスのバイトコード ファイル オブジェクトを直接取得します。この時点では、クラスはまだソース ファイルの段階にあり、文字コードファイルになっていません
  • Class clazz2 = Person.class;
    クラスが .class ファイルにロードされると、この時点で Person クラスは .class になります バイトコード ファイル オブジェクトを取得するとき、つまりクラス自体を取得するとき、クラスはバイトコード段階にあります
  • Class clazz3 = p.getClass();
    オブジェクト作成段階のクラスのインスタンスを通じて、クラスのバイトコードファイルオブジェクトを取得します。
クラスオブジェクトを取得するための Class.forName と x.class の違い
  • 静的コード ブロックと静的属性を処理する
    Class<?> clz = Class.forName("com.yan6.class2.A1");
    System.out.println(clz);

  • 静的コード ブロックと静的属性は処理されません
    Class<?> clz2=A1.class;
    System.out.println(clz2);

クラスの Class オブジェクトを取得します

Class クラスのインスタンスは、実行中の Java アプリケーション内のクラスとインターフェイスを表します。クラスの Class オブジェクトを取得するには 4 つの方法があります。

  • getClassを呼び出す
    • Boolean var1 = true;Class<?> classType2 = var1.getClass(); System.out.println(classType2);
      出力: クラス java.lang.Boolea
  • .class 構文の使用
    • Class<?> classType4 = Boolean.class; System.out.println(classType4);
      出力: クラス java.lang.Boolean
  • 静的メソッド Class.forName() を使用します。
    • Class<?> classType5 = Class.forName("java.lang.Boolean"); System.out.println(classType5);
      出力: クラス java.lang.Boolean
  • プリミティブ ラッパー クラスの TYPE 構文を使用すると、元の型がここで返されます。これは、Boolean.class によって返される型とは異なります。
    • Class<?> classType3 = Boolean.TYPE; System.out.println(classType3);
      出力: ブール値

public static Final Class TYPE = (クラス) Class.getPrimitiveClass(“boolean”);

コンストラクターの取得

リフレクション メカニズムを通じて特定のクラスのコンストラクターを取得し、そのコンストラクターを呼び出してクラスのインスタンスを作成します。Class<T>このクラスには、クラスのコンストラクターを取得するためのメソッドがいくつか用意されています。

  • Constructor<T> getConstructor(Class<?>... parameterTypes)
    この Class オブジェクトによって表されるクラスの指定されたパブリック コンストラクター メソッドを反映する Constructor オブジェクトを返します。
  • Constructor<?>[] getConstructors()
    この Class オブジェクトによって表されるクラスのすべてのパブリック コンストラクター メソッドを反映する Constructor オブジェクトを含む配列を返します。
  • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
    この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたコンストラクター メソッドを反映する Constructor オブジェクトを返します。
  • Constructor<?>[] getDeclaredConstructors()
    この Class オブジェクトによって表されるクラスによって宣言されたすべてのコンストラクターを反映する Constructor オブジェクトの配列を返します。これらは、パブリック、プロテクト、デフォルト (パッケージ) アクセス、およびプライベート コンストラクターです。

クラス属性を取得する

クラスのフィールドを取得します。リフレクション メカニズムを通じて特定のクラスの特定のプロパティを取得し、このクラスの特定のインスタンスに対応するプロパティの値を変更できます。JAVAClass<T>クラスには、クラスのプロパティを取得するためのメソッドがいくつか用意されています。

  • Field getField(String name)
    この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリック メンバー フィールドを反映する Field オブジェクトを返します。
  • Field[] getFields()
    この Class オブジェクトによって表されるクラスまたはインターフェイスのアクセス可能なすべてのパブリック フィールドを反映する Field オブジェクトを含む配列を返します。
  • Field getDeclaredField(String name)
    この Class オブジェクトによって表されるクラスまたはインターフェイスの指定された宣言されたフィールドを反映する Field オブジェクトを返します。
  • Field[] getDeclaredFields()
    この Class オブジェクトで表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映する Field オブジェクトの配列を返します。

getFields と getDeclaredFields の違いは次のとおりです。

  • getFields は、親クラスで定義されたプロパティを含む、パブリックとして宣言されたプロパティを返します。
  • getDeclaredFields は、親クラスを除く、指定されたクラスによって定義されたすべての定義済み属性を返します。

クラス内のメソッドを取得する

リフレクション機構を通じて特定のクラスのメソッドを取得し、そのクラスのインスタンスに対応するメソッドを呼び出します。Class クラスには、クラスを取得するためのメソッドがいくつか用意されています。

  • Method getMethod(String name, Class<?>... parameterTypes)
    この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリック メンバー メソッドを反映する Method オブジェクトを返します。
  • Method[] getMethods()
    この Class オブジェクトによって表されるクラスまたはインターフェイスのパブリック メンバー (このクラスまたはインターフェイスによって宣言されたクラスまたはインターフェイス、およびスーパークラスおよびスーパーインターフェイスから継承されたクラスまたはインターフェイスを含む) メソッドを反映する Method オブジェクトを含む配列を返します。
  • Method getDeclaredMethod(Stringname, Class<?>... parameterTypes)
    この Class オブジェクトによって表されるクラスまたはインターフェイスの指定された宣言されたメソッドを反映する Method オブジェクトを返します。
  • Method[] getDeclaredMethods()
    この Class オブジェクトで表されるクラスまたはインターフェイスによって宣言されたすべてのメソッドを反映する Method オブジェクトの配列を返します。これには、パブリック メソッド、プロテクト メソッド、デフォルト (パッケージ) アクセス、プライベート メソッドが含まれますが、継承されたメソッドは含まれません。

JDK では、Java リフレクション メカニズムは主に次のクラスによって実装されます。

  • クラス class: クラスを表します

  • フィールド クラス: クラスのメンバー変数 (属性) を表します。

  • メソッドクラス: クラスのメソッドを表します。

  • コンストラクタークラス: クラスの構築メソッドを表します。

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

上記のクラスのうち、Class クラスは java.lang パッケージに含まれ、残りは java.lang.reflect パッケージに含まれます。

java.lang.Object クラス (すべてのクラスのスーパークラス) は getClass() メソッドを定義しており、これを介して Java オブジェクトはそのクラスを取得できます。

おすすめ

転載: blog.csdn.net/qq_39756007/article/details/126879067