薬剤は、典型的に仲介として作用するように、プロキシモードは、追加の動作または異なる動作を提供することであり、その代わりにオブジェクトを挿入し、実際のオブジェクトの使用、これらの操作は、オブジェクトとの実際の通信に関連します
、Javaの動的プロキシ
Javaの動的プロキシエージェントを動的に作成し、動的プロキシアプローチへのコールを処理することができます。動的プロキシで作られたすべてのコールは、単一の呼び出し上のプロセッサにリダイレクトされます。
1、動的プロキシは、5つのステップであります
(1)インタフェースと実装クラスを書き込みます
public interface UserDao {
void addUser(String var1);
}
public class UserDaoImpl implements UserDao{
@Override
public void addUser(String userName) {
System.out.println("添加用户"+userName);
}
}
(2)あなた自身のInvocationHandler InvocationHandlerです(主に書かれたinvokeメソッド)をカスタマイズするためのインタフェースを実装することによって、
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始记录日志");
method.invoke(target,args);
System.out.println("结束记录日志");
return null;
}
}
(3)メソッドを使用してプロキシオブジェクトを作成し、メソッドを実装たとえば、Proxy.newProxyInstance
UserDao userDao = new UserDaoImpl();
//构造函数中传入实际对象
LogHandler logHandler = new LogHandler(userDao);
UserDao userDAOProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),logHandler);
userDAOProxy.addUser("aaa");
2、Javaの動的プロキシ解像度の原則
コアJava動的プロキシは、たとえば、Proxy.newProxyInstance(クラスローダローダ、クラス<?である > []インターフェイス、のInvocationHandlerのH)。プロキシオブジェクトを生成します。
クラスローダローダ:クラスローダを示すためのプロキシオブジェクトを生成します。
クラスは[]のインターフェイス<?>:プロキシオブジェクトは(プロキシクラスとターゲットクラスが同じインターフェイスを実装する必要があります)生成されたオブジェクトを指定するために使用
のInvocationHandler H:最後の方法は、私たちの自己定義を呼び出します。
3、プロキシオブジェクトを生成する方法のnewProxyInstance工程
(1)コンテンツProxy.getProxyClass(ProxyGenerator.generateProxyClass(proxyName、インターフェース)を介して、クラスバイトコードの動的プロキシクラスを取得します )。
プロキシクラスのオブジェクトを生成する(2)仮想マシンにロードするバイトコード・クラス・ローダを通過し、その後、プロキシクラスのコンストラクタを反射することによって得られる(方法署名getConstructor(InvocationHandler.class))、