Guice-AOP invok "synthetic" method
- Dominant language
- Java
- Stars
- 12.7k
- Forks
- 1.7k
- Avg merge
- 11m
- Merged PRs (30d)
- 2
Description
_From [anthony.muller](https://code.google.com/u/112686044244068537059/) on September 29, 2008 05:37:25_
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<?>>();
...
_Original issue: http://code.google.com/p/google-guice/issues/detail?id=252_
Contributor guide
Assessment
This issue has not been assessed yet.