JAva静的エージェントと動的エージェント
6572 ワード
エージェント:エージェントクラスで委任クラスのいくつかの機能と追加の前処理機能(メッセージフィルタリング、ログなどを含む)を実現します.
JAvaのエージェントは静的エージェントと動的エージェントに分けられる.動的エージェントにはjdkエージェントとcglibエージェントもあります.静的エージェントは、継承スーパークラスエージェントとインタフェースエージェントに分けられます(名前は重要ではありませんが、後述します).
詳細に説明する前に、静的エージェントと動的エージェントの違いを説明します.
静的エージェントの場合,エージェントクラスは被エージェントインタフェースのすべての方法を実現する.
動的エージェントはjava反射メカニズムを利用しており,エージェントクラスはInvocationHandlerインタフェースを実現するだけでよく,インタフェースのすべての方法を実現する必要がなく,拡張とコード最適化に明らかな優位性がある.
第一:静的エージェント
Javaではインタフェースを実装するか親を継承してこそその機能を実現することができ,すなわちこの点によって静的エージェントは継承エージェントとインタフェースエージェントに分けることができる.
1、継承エージェント
エージェントの機能は一般的に実現されていないほうがよいが,そうでなければエージェントに価値がないため,被エージェントクラス(委任クラス)はabstractであることが望ましく,継承エージェントも出現する.
//抽象類
2,インタフェースエージェント
このエージェントはよく知られていて、多くの人が使ったもので、インタフェースを実現する方法でエージェントを実現しています.コードは以下の通りです.
第二:動的エージェント
動的エージェントはjava反射メカニズムを利用しており,エージェントクラスはInvocationHandlerインタフェースを実現することによって依頼クラス機能の実現を完了しているが,実はjdkがjavaのコードの一部をカプセル化しており,InvocationHandlerインタフェースを実現する際にはinvokeメソッドを実現する必要があるが,invokeメソッドでは2つの必要パラメータエージェントクラスとMethodを伝達する必要がある.このうちmethodのinvokeメソッドは,委任クラス内のすべてのインタフェースを実現することができ,この階層がカプセル化されているため,エージェントクラスは被エージェントクラスを継承したり実現したりする必要がなく,エージェント機能を実現することができる.
JAvaのエージェントは静的エージェントと動的エージェントに分けられる.動的エージェントにはjdkエージェントとcglibエージェントもあります.静的エージェントは、継承スーパークラスエージェントとインタフェースエージェントに分けられます(名前は重要ではありませんが、後述します).
詳細に説明する前に、静的エージェントと動的エージェントの違いを説明します.
静的エージェントの場合,エージェントクラスは被エージェントインタフェースのすべての方法を実現する.
動的エージェントはjava反射メカニズムを利用しており,エージェントクラスはInvocationHandlerインタフェースを実現するだけでよく,インタフェースのすべての方法を実現する必要がなく,拡張とコード最適化に明らかな優位性がある.
第一:静的エージェント
Javaではインタフェースを実装するか親を継承してこそその機能を実現することができ,すなわちこの点によって静的エージェントは継承エージェントとインタフェースエージェントに分けることができる.
1、継承エージェント
エージェントの機能は一般的に実現されていないほうがよいが,そうでなければエージェントに価値がないため,被エージェントクラス(委任クラス)はabstractであることが望ましく,継承エージェントも出現する.
//抽象類
public abstract class UserDao {
public abstract void userAdd();
public abstract void userDelete();
}
//userDao
public class UserDaoDB2Impl extends UserDao {
@Override
public void userAdd() {
System.out.println("insert user data into db2 datebase!");
}
@Override
public void userDelete() {
System.out.println("delete user data from db2 datebase!");
}
}
//userDao
public class UserDaoMysqlImpl extends UserDao {
@Override
public void userAdd() {
System.out.println("insert user data into mysql datebase!");
}
@Override
public void userDelete() {
System.out.println("delete user data from mysql datebase!");
}
}
//userDao
public class UserDaoProxy extends UserDao {
UserDao dao;
public UserDaoProxy(UserDao d){
this.dao=d;
}
@Override
public void userAdd() {
dao.userAdd();
}
@Override
public void userDelete() {
dao.userDelete();
}
}
//
public class UserDaoTest {
/**
* @param args
*/
public static void main(String[] args) {
UserDao mysqldao=new UserDaoMysqlImpl();
UserDao db2dao=new UserDaoDB2Impl();
UserDaoProxy p=new UserDaoProxy(mysqldao);
// UserDaoProxy p=new UserDaoProxy(db2dao);
p.userAdd();
}
}
2,インタフェースエージェント
このエージェントはよく知られていて、多くの人が使ったもので、インタフェースを実現する方法でエージェントを実現しています.コードは以下の通りです.
//
public interface AdminDao {
public void adminAdd();
public void adminDel();
}
// DB2
public class AdminDaoDB2Impl implements AdminDao {
@Override
public void adminAdd() {
System.out.println("insert admin data into DB2 database!");
}
@Override
public void adminDel() {
System.out.println("delete admin data from DB2 database!");
}
}
// oracle
public class AdminDaoOracleImpl implements AdminDao {
@Override
public void adminAdd() {
System.out.println("insert admin data into oracle database!");
}
@Override
public void adminDel() {
System.out.println("delete admin data from oracle database!");
}
}
//AdminDao
public class AdminDaoProxy implements AdminDao {
AdminDao dao;
public AdminDaoProxy(AdminDao dao){
this.dao=dao;
}
@Override
public void adminAdd() {
dao.adminAdd();
}
@Override
public void adminDel() {
dao.adminDel();
}
}
//
public class AdminTest {
public static void main(String arg[]){
AdminDao db2Dao=new AdminDaoDB2Impl();
AdminDao oracleDao=new AdminDaoOracleImpl();
AdminDaoProxy proxy_1=new AdminDaoProxy(db2Dao);
proxy_1.adminAdd();
AdminDaoProxy proxy_2=new AdminDaoProxy(oracleDao);
proxy_2.adminAdd();
}
}
第二:動的エージェント
動的エージェントはjava反射メカニズムを利用しており,エージェントクラスはInvocationHandlerインタフェースを実現することによって依頼クラス機能の実現を完了しているが,実はjdkがjavaのコードの一部をカプセル化しており,InvocationHandlerインタフェースを実現する際にはinvokeメソッドを実現する必要があるが,invokeメソッドでは2つの必要パラメータエージェントクラスとMethodを伝達する必要がある.このうちmethodのinvokeメソッドは,委任クラス内のすべてのインタフェースを実現することができ,この階層がカプセル化されているため,エージェントクラスは被エージェントクラスを継承したり実現したりする必要がなく,エージェント機能を実現することができる.
//
public interface AdminDao {
public void adminAdd();
public void adminDel();
}
// DB2
public class AdminDaoDB2Impl implements AdminDao {
@Override
public void adminAdd() {
System.out.println("insert admin data into DB2 database!");
}
@Override
public void adminDel() {
System.out.println("delete admin data from DB2 database!");
}
}
// oracle
public class AdminDaoOracleImpl implements AdminDao {
@Override
public void adminAdd() {
System.out.println("insert admin data into oracle database!");
}
@Override
public void adminDel() {
System.out.println("delete admin data from oracle database!");
}
}
//
public class AdminDaoDynamicProxy implements InvocationHandler {
AdminDao admindao;
public AdminDaoDynamicProxy(AdminDao d){
this.admindao=d;
}
@Override
public Object invoke(Object proxy, Method method, Object[] arg2)
throws Throwable {
System.out.println("before---");
Object obj=method.invoke(admindao, arg2);
System.out.println("after----");
return obj;
}
}
//
public class AdminDynamicTest {
public static void main(String[] args) {
AdminDao db2dao=new AdminDaoDB2Impl();
AdminDaoDynamicProxy proxy=new AdminDaoDynamicProxy(db2dao);
// ( )
AdminDao dao=(AdminDao)Proxy.newProxyInstance(AdminDao.class.getClassLoader(), new Class[]
{AdminDao.class},proxy);
dao.adminAdd();
}
}
備考:エージェントクラスではいくつかの補助機能を実現することができますが、私は追加していません.これは必要なときに追加することができます.ここでは省略します.