Issue 252: Guice-AOP invok "synthetic" method
http://code.google.com/p/google-guice/issues/detail?id=252
New issue report by anthony.muller:
The test case:
@Retention(RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface MyAnno {}
public interface IToto {}
public class TotoImpl implements IToto {}
@MyAnno
public interface ITotoService {
/**
* A great method which will do something
*
* @return
*/
IToto doSomething();
}
public class TotoServiceImpl implements ITotoService {
public TotoImpl doSomething() {
return null;
}
}
package tests.guice;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.matcher.AbstractMatcher;
import com.google.inject.matcher.Matchers;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TotoModule());
ITotoService totoService = injector.getInstance(ITotoService.class);
// Method call
totoService.doSomething();
}
}
class TotoModule extends AbstractModule {
@Override
protected void configure() {
bind(ITotoService.class).to(TotoServiceImpl.class);
bindInterceptor(Matchers.any(), new
TypeAnnotatedMatcher(MyAnno.class), new TotoInterceptor());
}
}
class TotoInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation mi) throws Throwable {
System.out.println(mi.getMethod().getName() + " -> isSynthetic ? "
+ mi.getMethod().isSynthetic());
return mi.proceed();
}
}
class TypeAnnotatedMatcher extends AbstractMatcher<Method> {
private final Class<? extends Annotation> annClass;
/**
* Constructor.
*
* @param annClass
*/
public TypeAnnotatedMatcher(final Class<? extends Annotation> annClass)
{
this.annClass = annClass;
}
/**
* Search for the method signature into all the interface annotated
with a
* given annotation.
*/
public boolean matches(Method method) {
// Hook to avoid twice interceptions of the same method
if (method.isSynthetic()) {
//return false;
}
boolean matches = false;
Class<?> type = method.getDeclaringClass();
Class<?>[] iTypes = ReflectUtils.getInterfaces(type, annClass);
for (Class<?> iType : iTypes) {
Method iMethod = null;
try {
iMethod = iType.getDeclaredMethod(method.getName(), method
.getParameterTypes());
} catch (SecurityException e) {
// Should never happen
} catch (NoSuchMethodException e) {
// Should never happen
}
if (iMethod != null) {
matches = true;
break;
}
}
return matches;
}
}
class ReflectUtils {
/**
* Get type annoted with the given annotation
*
* @param type
* Type where we have to search for annoted interfaces
*
* @param annClass
* Annotation to find
*
* @return Class<?>[]
*/
public final static Class<?>[] getInterfaces(final Class<?> type,
final Class<? extends Annotation> annClass) {
List<Class<?>> annTypes = new ArrayList<Class<?>>();
Class<?>[] iTypes = type.getInterfaces();
for (Class<?> iType : iTypes) {
if (iType.isAnnotationPresent(annClass)) {
annTypes.add(iType);
}
}
return annTypes.toArray(new Class<?>[annTypes.size()]);
}
}
Issue attributes:
Status: New
Owner: ----
Labels: Type-Defect Priority-Medium
--
You received this message because you are listed in the owner
or CC fields of this issue, or because you starred this issue.
You may adjust your issue notification preferences at:
http://code.google.com/hosting/settings
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---