1。ジャワの反射
1.リフレクションを介してクラスの属性とメソッドインスタンスコードをロードします。
/*** java.lang.classは反射のソースです*クラスを作成し、コンパイル(javac.exe)で対応するクラスファイルを生成しました。このクラスファイル*このクラスファイルがメモリにロードされた後、このクラスファイル*をロードした後、キャッシュ領域を備えたランタイムクラスになります。このランタイムクラスは、クラスのインスタンスです *各ランタイムクラスは1回しか読み込まれません */ class <sudtentexam> clazz = dustentexam.class; StudentExam StudentExam = clazz.newinstance(); system.err.println(desudentExam); System.out.println(clazz); // field field = clazz.getfield( "id"); //属性を介してランタイムクラスの指定された属性を呼び出します。 //属性は非パブリック型フィールド[] fields = clazz.getDeclaredfields()です。 //ランタイムクラス自体のすべての宣言されたプロパティを取得します(親クラスはできません)。親クラスはclazz.getfields()を使用します。 for(field field2:fields){int i = field2.getModifiers(); string type = modifier.toString(i); //フィールド属性system.out.println(type)のデータ型を取得します; } field.setAccessible(true); field.set(desudentexam、11); system.err.println(studentexam.getId()); //反射方法を介してランタイムクラスの指定されたメソッドを呼び出す方法= clazz.getMethod( "setID"、integer.class); Method.Invoke(desudentExam、123); //ランタイムクラスの指定されたメソッドを呼び出します[] methods = clazz.getMethods(); //すべてのランタイムクラスとその親クラスで公開されているすべてのメソッドを取得します方法[] Methods2 = clazz.getDeclaredMethods(); } // *オブジェクトのgetClass()メソッドを介してオブジェクトのランタイムクラスを取得します、試験exam = new Exam(); class clazzexam = exam.getClass();2。クラスローダー
/** *説明:クラスローダー、xx.propertiesファイルをロードし、データを読み取ります * @param * @author xiazhongwei * @data 2016年9月29日:5:32:56 pm * @return */public void classloader()throws ioexception {//メソッド1。 //パスはパッケージの下に書かれています:com // ableexam // resources // config.properties inputstream instream = loader.getResourceasStream( "config.properties"); //方法2。指定されたパスからファイルをロードする// fileinputStream fileinputStream = new fileInputStream(new File( "config.properties"));プロパティプロパティ= new Properties(); properties.load(instream); // properties.load(fileinputStream); string prop = properties.getProperty( "domain"); System.out.println(prop); }3。動的プロキシ
静的プロキシ:プロキシクラスとターゲットオブジェクトのタイプは、コンピレーション中に決定されますが、これはプログラムの拡張を助長しません。同時に、各プロキシクラスは1つのインターフェイスのみを提供できるため、プログラム開発では必然的に多くのプロキシが発生します。
動的プロキシ:クライアントは、プロキシクラスを介して他のオブジェクトのメソッドを呼び出し、プログラムが実行されているときに必要に応じてターゲットクラスのプロキシオブジェクトを動的に作成します。
エージェントデザインパターンの原則:
プロキシを使用してオブジェクトをラップし、元のオブジェクトをそのプロキシオブジェクトに置き換えます。元のオブジェクトへの呼び出しは、プロキシオブジェクトがメソッドが呼び出されるかどうかといつ決定されるかどうか、および時期を介してでなければなりません
パッケージcom.test.junit; Import java.lang.reflect.invocationHandler; Import Java.lang.Reflect.Method; Import java.lang.Reflect.Proxy; public class proxytest {public static void main(string [] args){realsubject realsubject = new realSubject(); myInvocationHandler myInvocationHandler = new MyInVocationHandler();オブジェクトオブジェクト= myInvocationHandler.bind(realSubject);サブジェクト件名=(件名)オブジェクト; subject.action(); }} //動的プロキシインターフェイス件名の使用{void action();} // class realsubject empments experment {@override public void action(){system.out.println( "私はプロキシクラスです。 }} class myInvocationhandlerを実装するrimcotionhandler {オブジェクトオブジェクト; //インターフェイスのプロキシクラスのオブジェクトの宣言this.object = object; proxy.newproxyinstance(object.getClass()。getClassLoader()、object.getClass()。getInterfaces()、this); } / ** *書き換えられたメソッドへの呼び出しがプロキシクラスのオブジェクトを介して開始されると、次のInvokメソッドへの呼び出しに変換されます * / @Override public object invoke(Object Proxy、Method Method、Object [] args)Throws {object returnObject = method.invoke(object、args); return returnobject; }}4.動的プロキシとAOP
例1。
パッケージcom.atguigu.spring.aop; public interface arithmeticcalculator {int add(int i、int j); int sub(int i、int j); int mul(int i、int j); int div(int i、int j);}パッケージcom.atguigu.spring.aop; org.springframework.stereotype.componentをインポートします。 @component( "arithmeticCalculator")public class arithmeticcalculaturempl arithmeticcalculator {@override public int add(int i、int j){int result = i + j;返品結果; } @override public int sub(int i、int j){int result = i -j;返品結果; } @override public int mul(int i、int j){int result = i * j;返品結果; } @override public int div(int i、int j){int result = i / j;返品結果; }}パッケージcom.atguigu.spring.aop;パブリッククラスarithmeticCalculatureLoggingImplは、arithmeticCalculator {@Override public int(int i、int j){system.out.println( "メソッドの追加が[" + i + "、" + j + "]"で始まる "); int result = i + j; System.out.println( "メソッドは" + resultで終了します);返品結果; } @override public int sub(int i、int j){system.out.println( "メソッドサブは[" + i + "、" + j + "]"で始まります); int result = i -j; System.out.println( "メソッドは" + resultで終了します);返品結果; } @override public int mul(int i、int j){system.out.println( "メソッドmulは[" + i + "、" + j + "]"で始まります。 int result = i * j; system.out.println( "メソッドmulは[" + i + "、" + j + "]"で始まります。 int result = i * j; system.out.println( "メソッドmulは" + resultで終了します);返品結果; } @Override public int div(int i、int j){system.out.println( "メソッドdivは[" + i + "、" + j + "]で始まります。 int result = i / j; system.out.println( "メソッドdivは" + resultで終わります);返品結果; }}パッケージcom.atguigu.spring.aop; Import java.lang.reflect.invocationHandler; Import Java.lang.Reflect.Method; Import Java.lang.Reflect.Proxy; Import Java.util.arrays; public class arithmeticcalculaturalloggingproxy {//オブジェクトはプロキシになります。 public ArithMeticCalculaturalLoggingProxy(arithmeticCalculatorターゲット){super(); this.target =ターゲット; } // proxyオブジェクトを返すpublic arithmeticcalculator getloggingproxy(){arithmeticCalculator proxy = null; //プロキシオブジェクトのクラスローダーは、classloader loader = target.getClass()をロードする責任があります。GetClassLoader(); //プロキシオブジェクトのタイプ、つまり、その中にどのような方法がありますか。 class [] interfaces = new class [] {arithmeticCalculator.class}; //プロキシオブジェクトのメソッドを呼び出すとき、次のコードInvocationHandler h = new InvocationHandler(){ /*** proxy:proxyオブジェクトを実行します。このオブジェクトは一般に使用されていません*方法:呼び出されるメソッド* args:コールメソッドに渡されたパラメーター*/ @OverrideパブリックオブジェクトInvoke(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args)スロー可能{//プロキシオブジェクトのメソッドはメソッド内に直接呼び出されません。 proxy.toString()により、デッドループがInvoke Method string methodname = method.getName()を呼び出します。 // log system.out.println( "[before] method" + methodname + "が" + arrays.aslist(args))で開始されます。 //ターゲットメソッドオブジェクトを呼び出すresult = null; try {// notification pre-notification result = method.invoke(ターゲット、args); //通知を返すと、メソッドの返品値にアクセスできます} catch(nullpointerexception e){e.printstacktrace(); //例外通知、メソッドの例外にアクセスできます} //ポストノット化。メソッドには例外がある可能性があるため、メソッドの返品値にアクセスできません//ログsystem.out.printlnを印刷することはできません。返品結果; }}; /***ローダー:プロキシオブジェクトで使用されるクラスローダー。 *インターフェイス:プロキシオブジェクトのタイプを指定します。つまり、プロキシプロキシオブジェクトにどのような方法がありますか。 * H:プロキシオブジェクトのメソッドを呼び出すとき、どのように応答する必要がありますか?実際、Invoke InvocationHandler*/ proxy =(arithmeticCalculator)proxy.newProxyInstance(Loader、Interfaces、H)を呼び出すことです。プロキシを返します。 }}パッケージcom.atguigu.spring.aop; Import org.springframework.context.applicationcontext; Import org.springframework.context.support.classpathxmlapplicationcontext; public class main {public static void main(string [] args){// arithmeticcalculator arithmeticcalculature = new arithmeticcalculaturaturaturatureimpl(); arithmeticcalculator arithmeticcalculator = new arithmeticcalculaturalloggingimpl(); arithmeticCalculator = new arithmeticCalculaturalLoggingProxy(arithMeticCalculator).getLoggingProxy(); int result = arithmeticCalculator.add(11、12); System.out.println( "result:" + result); result = arithmeticcalculator.div(21、3); System.out.println( "result:" + result); }}例2。
パッケージcom.test.junit; Import java.lang.reflect.invocationHandler; Import Java.lang.Reflect.Method; Import java.lang.Reflect.Proxy; public class proxytest {public static void main(string [] args){realsubject realsubject = new realSubject(); myInvocationHandler myInvocationHandler = new MyInVocationHandler();オブジェクトオブジェクト= myInvocationHandler.bind(realSubject);サブジェクト件名=(件名)オブジェクト; subject.action(); }} //動的プロキシインターフェイス件名の使用{void action();} // class realsubject empments experment {@override public void action(){system.out.println( "私はプロキシクラスです。 }} class myInvocationhandlerを実装するrimcotionhandler {オブジェクトオブジェクト; //インターフェイスのプロキシクラスのオブジェクトの宣言this.object = object; proxy.newproxyinstance(object.getClass()。getClassLoader()、object.getClass()。getInterfaces()、this); } / ** *書き換えられたメソッドへの呼び出しがプロキシクラスのオブジェクトを介して開始されると、次のInvokメソッドへの呼び出しに変換されます * / @Override public object invoke(Object Proxy、Method Method、Object [] args)Throws {object returnObject = method.invoke(object、args); return returnobject; }}この記事を読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!