Javaが起動するピットを埋めます!
いくつかのショートカットを1.Intellij
intell一般的に使用されるショートカットキー:
素早く位置決めクラスを見つけるには、Ctrl + N
CTRL + qはすぐに文書情報のクラスを表示します
シフト+ F6速いクラス変数は、名前を変更します
現在の方法でインターフェイスを実装し、CTRL + Iクラス
基底クラスのCTRL + O複製方法
Ctrl + Shiftキー+スペースは、現在の変数の関数を推奨します
急速なALTの方法は、配置されたクラスを挿入します+
CTRL +シフト+すぐに、様々なタイプ、変数、演算子を見つけます
自動的に生成されたCtrl + Alt + T例外は、ブロックをキャプチャ
Ctrl + Alt + Bの位置は、抽象メソッドを実装します
Ctrl + Alt + Vクラスを反映するオブジェクトを抽出します
CTRL + /コメント/キャンセル一行
CTRL +シフトは+ /複数行のコメント
現在の要素に対応する文書を開くために、シフト+ F1ブラウザ
CTRL +シフト+または下矢印を迅速に現在行の行に移動することができます
少し表現の後ろに追加します。自動的に選択基準に追加することができます
CTRL +シフト+ mはコードの再利用のための新しい方法にコードブロックで定義されてもよいです
指定された変数を抽出するためのCTRLは+ ALT + C
これを達成するために、Ctrl + Alt + Bが界面に配置されます
Ctrl + Alt + Lは単線を取り消す、全体コードインタフェースすっきりを行うことができ
CTRL + pは、あなたが何をパラメータとパラメータの種類現在の関数を使用することができ促すことができる、私はより便利に感じます
私は特定のメソッドの現在の定義を見ることができますCTRL +シャツ+
すぐに次の場所でエラーを見つけるために、F2キー
F4は、クラスのソースコードを分析するために配置されてもよいです
CTRL + F12はすぐにクラス、メソッド、変数など、現在のファイルの構造を分析することができます
CTRL + F F3検索文字列文字列は、次のマッチング、シフト+ F3に配置され、上部に一致する文字列を返します
Ctrlキー+ Shift + Enterや迅速な生成ブロックの場合
いくつかの基本の2.java
apache-tomcat-7.0.34\webapps
デフォルトでは、Webプロジェクトの展開。Webアプリケーションは、プロジェクト名の下のフォルダで、一般的にはプロジェクトの下ウェブルートは、Webサイトのルートである一方で、WEB-INFフォルダのデフォルトの下のWebrootウェブルートファイルは、Webアクセスを維持することです、一般的に構成され、主にnginxの設定があります漏洩しませんこのディレクトリを除外する。
連載
自然デシリアライゼーションの脆弱性が悪意のあるシリアル化されたデータに逆シリアル化プロセス内のオブジェクトに還元される注入する攻撃を得、データ及びオブジェクトの境界を破壊する抗シリアル化メカニズムであり、制御対象は、上記ターゲット・システムへの攻撃を行うことができますコード。RMI JMX JMS(Java Message Serviceの)技術で使用されるJavaのシリアライズ。
オブジェクトは、バイトのシーケンスとして表すことができ、Javaのオブジェクトのシリアル化メカニズムが提供され、オブジェクトのデータ・タイプ、オブジェクトデータに格納されたオブジェクトに関するタイプ情報を含むバイト配列。
成功するためには、クラスのオブジェクトのシリアル化は、2つの条件が満たされる必要があります。
クラスはjava.io.Serializableのオブジェクトを実装する必要があります。
クラスのすべてのプロパティは、シリアライズ可能である必要があります。プロパティは、シリアライズされていない場合、プロパティは短命示す必要があります。
テストクラスのインスタンスは、非常に単純な直列化できる場合、唯一のクラスでjava.io.Serializableインタフェースを達成していない確認する必要があります。
外部化と達成Serializableインタフェースオブジェクトクラスをシリアル化することができます。
Externalizableインタフェースは、直列化インターフェースから継承、インタフェースクラスは、完全に配列自体の動作によって制御される外部化を実装のみシリアライズクラスインターフェースを採用することができるデフォルトのシリアル化を実現します。
ObjectOutputStreamのクラスは、オブジェクトをシリアル化するために使用されます
デシリアライズオブジェクトのObjectInputStreamのクラス
以下は、オリジナルのデシリアライズ時のreadObjectのObjectInputStreamによる画像の一連のファイルを読み取るために、writeObjectメソッドObjectOutStreamオブジェクトファイルによって書き込まれる簡単なシリアル化および逆シリアル化プロセスでありますオブジェクトは、オブジェクト、使用(クラス名)シリアライズ復元するためにオブジェクトのクラスに対応するオブジェクトに変換されています
輸入java.io.FileOutputStreamは、 輸入java.io.ObjectOutputStreamの。 輸入 java.io. * ; パブリック クラス xuliehuaは実装 シリアライズ{ パブリック 静的 列A =「A」を、 パブリック 静的 ボイドメイン(文字列[]引数){ xuliehuaテスト = 新しいxuliehua()。 試す{ ObjectOutputStreamのT = 新しい ObjectOutputStreamの(新しいたFileOutputStream( "./ xuliehua" ))。 t.writeObject(テスト)。 t.close(); ObjectInputStreamのTT = 新しい ObjectInputStreamの(新しい FileInputStreamを( "xuliehua" )); xuliehua X = (xuliehua)tt.readObject(); System.out.println(XA)。 } キャッチ(のIOException | ClassNotFoundExceptionが電子){ e.printStackTrace(); } } }
生成されたJavaのデータ列が、バイトのシーケンスである、base64では、より読みやすく見えます
カスタムシリアル化および逆シリアル化プロセスが、書き換えることであるwriteObject
とreadObject
方法
輸入java.io.FileOutputStreamは、 輸入java.io.ObjectOutputStreamの。 輸入 java.io. * ; パブリック クラス xuliehuaは実装 シリアライズ{ パブリック 静的 列A =「A」を、 プライベート のボイドのreadObject(ObjectInputStreamの中){ しようと{ )(in.defaultReadObjectを。Runtime.getRuntime()のexec( "CALC.EXE" ); } キャッチ(IOExceptionを電子){ e.printStackTrace(); } キャッチ(ClassNotFoundExceptionが電子){ )(e.printStackTraceします。 } } パブリック 静的 ボイドメイン(文字列[]引数){ xuliehuaテスト = 新しいxuliehua()。 試す{ ObjectOutputStreamのT = 新しい ObjectOutputStreamの(新しいたFileOutputStream( "./ xuliehua" ))。 t.writeObject(テスト)。 t.close(); ObjectInputStreamのTT = 新しい ObjectInputStreamの(新しい FileInputStreamを( "xuliehua" )); xuliehua X = (xuliehua)tt.readObject(); } キャッチ(IOExceptionを| ClassNotFoundExceptionが電子を){ e.printStackTrace(); } } }
実際には、書き換え多型のプロパティのJavaを使用するreadObjectメソッドをオーバーライドし、コマンド定義文、自己実行しているの赤いラインRuntime.getRuntime.exec、および抗ジャワのほとんどここでは、ポップアップする電卓を上記のコードを実行します原則としてシリアル化が脆弱であるクラスが上書きしますreadObject
方法を
Javaの反射機構:
運転状態のプログラムで、あなただけの任意の既にロードされたクラスのために、私たちはこのクラスのすべてのプロパティとメソッドを知ることができるが、動的なクラス名をロードすることができます。任意のオブジェクトのために、彼はメソッドとプロパティのいずれかを呼び出すことができます。
終了クラスをロードした後、ヒープがクラスオブジェクトタイプ(クラスクラスオブジェクトの一方のみ)で生成され、このオブジェクトは、ミラーを通して見る、完全な構造情報クラス、及び鏡など、このクラスのオブジェクトを含みますクラス構造は、それが呼び出されます反映します
各クラスがメモリにロードされた後、システムがクラスに対応するのjava.lang.Classオブジェクトを生成し、あなたはこのClassオブジェクトクラスを介してJVMにアクセスする必要があります。
Classオブジェクトの取得方法:
インスタンス()メソッドをオブジェクトのGetClass。
クラスの.class(最も安全/最高のパフォーマンス)の特性。
動的classNameはクラス(最も一般的)の完全修飾名である必要があり、クラスをロードするClass.forNameの(文字列クラス名)を使用してください。
なお、自動的にClassオブジェクトを初期化しませんClassオブジェクトへの参照を作成する機能を「.classファイル」を使用して、使用forName()オブジェクトが自動的に初期化されるクラス
インポートjava.awt.desktop.SystemEventListener; 輸入 java.io. * ; 輸入にjava.lang.reflect.InvocationTargetException; インポートjava.lang.reflect.Methodオブジェクト、 パブリック クラスリフレクション{ 公共 静的 ボイドメイン(文字列[]引数){ クラステスト =テスト。クラス、クラスの基準テスト作成によって//の.classケース するSystem.out.println( "回復" + test.getName())を、 方法、[]メソッド = test.getMethods(); //クラスとすべてのオブジェクト型クラスのテストメソッドにアクセスする ための(メソッド、メソッド:メソッド){ のSystem.out.println(「メソッド=>」+method.getName()); } 試み{ メソッド、メソッド = test.getMethodは(「ハック」、文字列。クラス); //アクセス方法getMethod反射法クラス・オブジェクト・クラス・タイプによっては、二番目のパラメータでありますこのタイプの方法、ここでは文字列型 オブジェクトX = Method.invoke(新しい新しいテスト(「tr1ple」)、「23333」); //既にメソッドを呼び出すように位置決めメソッド型変数getmthod方法を呼び出すために呼び出しますこのとき、第1のパラメータは、クラスオブジェクトリフレクタのインスタンスである
入射のプロセスパラメータの第二のパラメータ ;のSystem.out.println(X) } キャッチ(IllegalAccessExceptionがE){ e.printStackTrace(); } キャッチ( EにInvocationTargetException){ e.printStackTrace(); } キャッチ(ないNoSuchMethodException電子){ e.printStackTrace(); } } } クラスのテスト{ プライベート文字列。 パブリックテスト(列A){ この .A = 。 } パブリック文字列ハック(列B){ 試みる{ するSystem.out.println( "TET" + この .A + "と" + B)。 Runtime.getRuntime()のexec( "CALC.EXE" ); } キャッチ(IOExceptionを電子){ e.printStackTrace(); } 戻りB。 } }
すなわち、反射のチェーン全体への実際の呼び出し:
オブジェクト・クラスの1.TEST.classクラスタイプは、クラスTESTの内部構造への容易なアクセスを得られます。
2.クラスオブジェクト - > getMethod()メソッドメソッドがコールする必要性を見つけます
3.メソッドの呼び出しが完了トリガ最終反射率関数を呼び出し、変数の型を反映するメソッドを呼び出します