Picoでアスペクト

あんまり流行ってる感じじゃないけど > Pico


MutablePicoContainer container = new DefaultPicoContainer(new DefaultComponentAdapterFactory() {
public ComponentAdapter createComponentAdapter(Object componentKey, Class componentImplementation, Parameter parameters) throws PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
final ComponentAdapter adapter = super.createComponentAdapter(componentKey, componentImplementation, parameters);

return new ComponentAdapter() {
public Object getComponentKey() {
return adapter.getComponentKey();
}

public Class getComponentImplementation() {
return adapter.getComponentImplementation();
}

public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
final Object instance = adapter.getComponentInstance(container);
Class interfaces = instance.getClass().getInterfaces();
ClassLoader loader = getClass().getClassLoader();

return Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(instance + "#" + method + " begin.");
Object retval = method.invoke(instance, args);
System.out.println(instance + "#" + method + " end.");
return retval;
}
});
}

public void verify(PicoContainer container) throws PicoIntrospectionException {
adapter.verify(container);
}

public void accept(PicoVisitor visitor) {
adapter.accept(visitor);
}
};
}
});

container.registerComponentImplementation(FooImpl.class);
container.registerComponentImplementation(BarImpl.class);
container.registerComponentImplementation(ZooImpl.class);
container.registerComponentImplementation(BazImpl.class);

Foo foo = (Foo) container.getComponentInstanceOfType(Foo.class);
foo.func();