反射
57.反射とは何ですか?
一次反射手段は、自身の状態や動作を検出し、修正する能力をプログラムにアクセスすることができます
Javaリフレクション:
Javaランタイム環境では、任意のクラスのために、あなたは、このクラスのプロパティとメソッドを持っているかを知ることができますか?任意のオブジェクトの場合、そのメソッドのいずれかを呼び出すことができます
Javaリフレクション機構は、主に以下の機能を提供します。
-
決意オブジェクトは、実行時に任意のクラスに属します。
-
任意の構成内のオブジェクトのランタイムクラスでは。
-
任意のクラスを分析することは、実行時にメンバ変数やメソッドを持っています。
-
実行時にオブジェクトのメソッドのいずれかを呼び出します。
58. Javaのシリアライズとは何ですか?あなたはどのような状況下でシリアライズする必要がありますか?
これは単に、メモリ内のさまざまなオブジェクトの状態(すなわち、インスタンス変数、しない方法)を保存することで、読み出し対象の状態を保存することができます。あなたがオブジェクトの状態を保存する方法は、独自のさまざまなを使用できますが、Javaはメカニズムを提供していますが、あなたに自分以外のオブジェクトの保存の良い状態を与え、それがシリアル化されなければなりません。
どのような状況下でシリアル化する必要があります。
a)は、オブジェクトの状態は、ファイルやデータベースときにメモリーに保存したい場合は、
B)は、ネットワーク上のソケット転送オブジェクトを使用する場合、
Cは)あなたは時にRMIオブジェクトを転送したい場合;
59.ダイナミックプロキシは何ですか?どのアプリケーションがありますか?
ダイナミックエージェント:
あなたは、インターフェイスクラスのメソッドに加え、いくつかの追加の処理を実装したいとき。たとえば、ログに加え、業務を追加します。あなたはインクレディブルという名前のクラスのプロキシは、元のクラスメソッドの機能だけでなく、新しいクラスを作成することです作成するだけでなく、余分な処理の新しいクラスはまだ元に基づいて追加することができます。プロキシクラスが定義されていない、動的に生成されます。デカップリングは意味、柔軟性、および強い拡張を持っています。
ダイナミックAgentアプリケーション:
-
SpringのAOP
-
プラス総務
-
プラス権利
-
プラスログ
60.どのように動的プロキシ?
我々は、最初のインターフェイスを定義するだけでなく、プロセスのInvocationHandlerクラス(それへのインターフェースを実装する転送オブジェクトクラス)しなければなりません。そして、プロキシのユーティリティクラスがある(彼はのnewInstance(呼び出すため習慣的に、プロキシクラスと呼ばれる)は、プロキシオブジェクトを生成することができますが、実際には、彼は、プロキシクラスのオブジェクトを生成するためだけのツールでした)。InvocationHandler、スプライシングプロキシクラスのソースコードを使用することは、ローダのロードを使用して、バイナリコード生成されたプロキシクラスをコンパイルし、それは代理オブジェクトのインスタンスを生じ、最終的に戻されます。
オブジェクトのコピー
61.なぜクローンを使うのか?
オブジェクトを考えて処理され、次の操作で元のデータを保持したい、あなたはクローンを必要とする、Java言語クローンクラスのインスタンスです。
62.どのようにオブジェクトのクローンを達成するには?
2つの方法があります。
1)Cloneableインタフェースを実現するクラスオブジェクトのクローン()メソッドをオーバーライドします。
次のように2)オブジェクトのシリアライゼーションおよびデシリアライゼーションをクローニングすることによって達成シリアライズを実装する、真の深さのクローンは、達成することができます。
1つのインポートjava.io.ByteArrayInputStream。 2インポートjava.io.ByteArrayOutputStreamを。 3輸入java.io.ObjectInputStream。 4インポートjava.io.ObjectOutputStreamの。 5インポートしたjava.io.Serializable。 6 7パブリッククラスMyUtil { 8 9プライベートMyUtil(){ 10投新しいてAssertionError()。 11} 12 13 @SuppressWarnings( "未チェック") 14パブリック静的<T延びシリアライズ> Tクローン(T obj)指定例外{スロー 15 ByteArrayOutputStream試合=新しいByteArrayOutputStreamを()。 16 ObjectOutputStreamのOOS =新しいObjectOutputStreamの(試合)。 17 oos.writeObject(OBJ)。 18 =新しい新しいれるByteArrayInputStreamれるByteArrayInputStream 19(bout.toByteArray())ビン、 20のObjectInputStreamはObjectInputStreamの新しい新OIS =(ビン)であり、 21は、リターン(T)ois.readObject()であり、 22は 23 //説明である:クローズするByteArrayInputStreamオブジェクトを呼び出すかByteArrayOutputStream任意の意味 の(例えば、ファイルストリームのような)外部リソースの解放は異なるオブジェクトメモリ、クリーンアップするためにリソースを解放することができるガベージコレクタ限り、これら二つの流れに基づいて24 // 25} 26}
ここでは、テストコードは次のとおりです。
1つのインポートたjava.io.Serializable。 2 3 / ** 4 *人类 5 * @author nnngu 6 * 7 * / 8クラス者が実装シリアライズ{ 9プライベート静的最終長いのserialVersionUID = -9102017020286042305L。 10 11プライベート文字列名; //姓名 12プライベートint型の年齢; //年龄 13プライベートカーの車。//座驾 14 15公共者(文字列名、int型の年齢、車の車){ 16 this.name =名; 17 this.age =年齢; 18 this.car =車。 19} 20 21公共の文字列のgetName(){ 22リターン名。 23} 24 25公共のボイドのsetName(文字列名){ 26 this.name =名。 27} 28 29公共のint getAge(){ 30リターン年齢。 31} 32 33公共ボイドsetAge(int型の年齢){ 34 this.age =年齢。 35} 36 37公共駐車getCar(){ 38リターン車。 39} 40 41公共ボイド関数setcar(車車){ =車42 this.car。 43} 44 45 @Override 46パブリック文字列のtoString(){ 47リターン"人物[NAME =" +名+ "年齢=" +年齢+ "車=" +車+ "]"。
1 / ** 2 *小汽车类 3 * @author nnngu 4 * 5 * / 6クラスカー実装シリアライズ{ 7プライベート静的最終長いのserialVersionUID = -5713945027627603702L。 8 9プライベート文字列のブランド。//品牌 10プライベートint型maxSpeed。//最高时速 11 12公共駐車(文字列ブランド、INT maxSpeed){ 13 this.brand =ブランド; 14 this.maxSpeed = maxSpeed。 15} 16 17公衆ストリングthisはgetBrand(){ 18リターンブランド; 19} 20 21公共ボイドsetBrand(文字列ブランド){ 22 this.brand =ブランド; 23} 24 25公衆INT getMaxSpeed(){ 26リターンmaxSpeed。 27} 28 29公共ボイドsetMaxSpeed(INT maxSpeed){ 30 this.maxSpeed = maxSpeed。 31} 32 33 @Override 34パブリック文字列のtoString(){ 35リターン"カー[ブランド=" +ブランド+ "maxSpeed =" + maxSpeed + "]"。 36} 37 38}
1クラスCloneTest { 2 3公共の静的無効メイン(文字列[] args){ 4試み{ 5人P1 =新しい新規人物( "郭靖"、33( "ベンツ"、300)、新たな新車である); 6人P2 = MyUtil。クローン(P1); //深いクローン 7 p2.getCar()setBrand( "BYD");.。 Personオブジェクト・ブランドに関連した8 //修正クローンP2カー・オブジェクト属性。 元の車に関連付けられている9 // P1のPersonオブジェクトを影響されないであろう その関連クローニングビヒクルオブジェクトもクローニングされているので、10 // Personオブジェクトを 11のSystem.out.println(P1); 12れる}キャッチ(例外E){ 13 e.printStackTrace(である); 14} 15} 16}
注意:クローニングの深さだけでなく、達成するためにシリアライズとデシリアライズをクローニングに基づいて、より重要なのは、ジェネリック医薬品によって制限されますが、オブジェクトが直列化をサポートしてクローンを作成する場合は、あなたがチェックアウトすることができ、このチェックが完了するコンパイラである、ないに異常動作をスローし、この方式は、クローンクローンオブジェクトクラスを使用する方法よりもはるかに優れています。常により良いさらさコンパイル時の問題は、実行時に問題を残してみましょう。
63.深い浅いコピーコピー差があるとは何ですか?
-
(:)(割り当て例)任意の値を変更することを特徴と浅いコピーだけコピーされたオブジェクトの参照アドレス、2つのオブジェクトが同一のメモリアドレスを指す、別の値も浅いコピーである、変化します
-
ディープコピーは、コピー目標値であり、上、2つのオブジェクトがディープコピー(例であり、他の値が変化しない任意の値を変更:JSON.parse()とJSON.stringify()が、この方法は機能を複製することはできませんタイプ)