一言でjavaダイナミックエージェントを要約

1970 ワード

要約:UserSvcのすべてのメソッドを呼び出すときに、各メソッドの前後にいくつかの処理を行い、実装クラスを変更したくない場合や、実装クラスを変更できない場合に、動的エージェントモードを使用します.
インタフェース:
public interface UserSvc {
	public void getUserInfo();
	public void CreateUser();
}

実装クラス:
public class UserSvcImpl implements UserSvc{

	@Override
	public void getUserInfo() {
		System.out.println("get user info.");
	}

	@Override
	public void CreateUser() {
		System.out.println("create a new user.");
	}

}

動的エージェントクラス:(希望する処理の詳細を除いて、このクラスの他の場所は基本的に変更せず、直接持って来ればいい)

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

public class UserProxy implements InvocationHandler {

	Object obj = null;

	public Object bind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
				.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("           ,       。");
		method.invoke(this.obj, args);
		System.out.println("           ,        。");
		System.out.println("");
		return null;
	}

}

テストクラス:
public class Test {
	public static void main(String[] args) {
		UserProxy proxy = new UserProxy();
		UserSvc userSvc = (UserSvc) proxy.bind(new UserSvcImpl());
		userSvc.getUserInfo();
		userSvc.CreateUser();
	}
}

出力結果:

           ,       。
get user info.
           ,        。

           ,       。
create a new user.
           ,        。