動的エージェントによるAOP思想の実現
ユーザー・ビジネス・インタフェース:
ユーザービジネスインタフェース実装クラス:
ビジネス・メソッド実行前の注記:
エージェントファクトリクラス:
クライアントコード:
package biz;
public interface UserBiz {
public void add();
}
ユーザービジネスインタフェース実装クラス:
package biz;
import annotation.Before;
public class UserBizImpl implements UserBiz {
@Before(name=" ")
public void log(){
System.out.println("UserBizImpl.log()");
}
public void add(){
System.out.println("UserBizImpl.add()");
}
}
ビジネス・メソッド実行前の注記:
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {
public String name() default "";
}
エージェントファクトリクラス:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import annotation.Before;
public class ProxyFactory implements InvocationHandler{
private Object target;
public Object getProxy(Object target) {
this.target = target;
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
System.out.println(" ");
parseBeforeMethod();
try {
obj = method.invoke(target, args);
System.out.println(" ");
} catch (Exception e) {
System.out.println(" ");
e.printStackTrace();
}finally{
System.out.println(" ");
}
return obj;
}
private void parseBeforeMethod(){
Class<?> clazz = target.getClass();
for(Method method : clazz.getDeclaredMethods()){
Before before = method.getAnnotation(Before.class);
if(before != null){
try {
method.invoke(target);
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
クライアントコード:
package client;
import proxy.ProxyFactory;
import biz.UserBiz;
import biz.UserBizImpl;
public class Client {
public static void main(String[] args) {
UserBiz userBiz = (UserBiz) new ProxyFactory().getProxy(new UserBizImpl());
userBiz.add();
}
}