Springの中のAOPの下の階は原理を実現します.


SpringにおけるAOPの下側実現原理:ダイナミックエージェント.
動的エージェントは、私の理解では、元の種類のオブジェクトメソッドのソースコードを変更しないで、エージェントを介して
オブジェクトの既存のオブジェクトメソッドの強化、すなわち既存のオブジェクトを拡張する機能です.
JDKダイナミックエージェントには、クラスとインターフェースが含まれています.
 InvocationHandlerインターフェース: 
public interface InvocationHandler{ public Object invoke(Object proxy、Method、Object[]args)throwable; } 
パラメータの説明: 
Object proxy:最終的に生成された代理例を指すが、一般的には使われない. Method method:呼び出す方法 Object[]args:メソッド呼び出しに必要なパラメータ 
InvocationHandlerインターフェースのサブクラスを1つのエージェントの最終操作クラスとして想像することができます.
 
Proxy類:
 Proxyクラスは、1つまたは複数のインターフェースのために、1つまたは複数のインプリメンテーションクラスを動的に生成することができ、このような操作方法を提供する.
 public static Object newProxInstance(Class Loader loader,Class)[]interfaces, InvocationHandler h) throws IllagalAgMentException 
パラメータの説明: 
Class Loader loader:クラスキャリア Class>[]interfaces:すべてのインターフェースを得る InvocationHandler h:InvocationHandlerインターフェースのサブクラスの例を得る 
Ps:クラスキャリア 
ProxyクラスにおけるnewProxyInstance()方法にはClass Loaderクラスの実例が必要であり、Class Loaderは実際にはクラスのキャリアであり、Javaには主に以下の3種類のキャリアがある. Boost strap Class Loader:このキャリアはC++で作成されています.一般的な開発では見られないです. Extendsion Class Loader:拡張クラスのロードを行うために使用されます.一般的に対応するのはjre\lib\extディレクトリのクラスです. ApClass Loader:(デフォルト)クラスパス指定のクラスをロードして、最もよく使われるのは一種のキャリアです.
動的エージェントクラスのバイトコードは、プログラム実行時にJava反射機構によって動的に生成され、プログラマが手動でソースコードを作成する必要がない.動的エージェントクラスは、プログラミング作業を簡単にするだけでなく、ソフトウェアシステムの拡張可能性を高めている.Java反射メカニズムは、任意のタイプの動的エージェントクラスを生成することができるからである.
java.lang.reflectパッケージのProxy類とInvocationHandlerインターフェースは、動的な世代を生成するために提供されます.
クラス
の能力を持っています
例コード:
1.まずインターフェースを作成します.
package com.ls.reflect.demo;

public interface StudentDao {
	public abstract void login();
	public abstract void regist();
}
2.もう一つのインターフェースの実装クラスを作成します.
package com.ls.reflect.demo;

public class StudentDaoImpl implements StudentDao {

	public void login() {
		System.out.println("  ");
	}

	public void regist() {
		System.out.println("  ");
	}

}
3.InvocationHandlerインターフェースを実現する
package com.ls.reflect.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHandler {
	private Object target;
	public Object bind(Object target){
        //        ,          
		this.target=target;
		//        
		return Proxy.newProxyInstance
				(target.getClass().getClassLoader(), 
						target.getClass().getInterfaces(), this);
	}
    //         ,    ,      
	public Object invoke(Object proxy, Method met, Object[] arg2)
			throws Throwable {
		System.out.println("    ");
		Object result=met.invoke(target, arg2);
		System.out.println("    ");
		return result;
	}

}
4.テストコード:
package com.ls.reflect.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class StudentDemo {
	public static void main(String[] args) {
	StudentDao sd=new StudentDaoImpl();
	sd.login();
	sd.regist();
	System.out.println("----------");
	
	MyInvocationHandler handler=new MyInvocationHandler();
	StudentDao proxy=(StudentDao)handler.bind(sd);
	proxy.login();
	proxy.regist();
	
	
	
}
}