Creation of method tables in ClassAdvisor
jaikiran May 13, 2009 8:57 AMNeed some input on a couple of things in the org.jboss.aop.ClassAdvisor http://anonsvn.jboss.org/repos/jbossas/projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/ClassAdvisor.java. During initialization and creation of method tables, the ClassAdvisor in it's addDeclaredMethod does this:
protected void addDeclaredMethods(Class<?> superclass) throws Exception { Method[] declaredMethods = superclass.getDeclaredMethods(); for (int i = 0; i < declaredMethods.length; i++) { if (ClassAdvisor.isAdvisable(declaredMethods[ i])) { long hash = MethodHashing.methodHash(declaredMethods[ i]); advisedMethods.put(hash, declaredMethods[ i]); try { Method m = declaredMethods[ i]; Method un = superclass.getDeclaredMethod(ClassAdvisor.notAdvisedMethodName(superclass.getName(), m.getName()), m.getParameterTypes()); un.setAccessible(true); unadvisedMethods.put(hash, un); } catch (NoSuchMethodException ignored) { } } } } public static String notAdvisedMethodName(String className, String methodName) { return className.replace('.', '$') + "$" + methodName + NOT_TRANSFORMABLE_SUFFIX; } /** * Suffix added to unadvised methods. */ public static final String NOT_TRANSFORMABLE_SUFFIX = "$aop";
Assuming i have this expression:
<domain name="XXX" extends="YYY" inheritBindings="true"> <bind pointcut="execution(public * *->*(..))"> ... </bind>
package org.myapp; public class SomeClass { public void method1() { .. } public void method2() { .. } }
1) So the addDeclaredMethod piece of code, above, is going to generate for each method an "unadvised method name" as:
org$myapp$SomeClass$method1$aop org$myapp$SomeClass$method2$aop
and later on when the
superclass.getDeclaredMethod(ClassAdvisor.notAdvisedMethodName(superclass.getName(), m.getName()),m.getParameterTypes());
is called it's always going to throw a NoSuchMethodException, isn't it?
What is the purpose of this code? I guess, there is some specific scenario where this comes into picture
2) The MethodHashing.methodHash() does some very specific/involved logic. How is it different from a normal method.hashCode()?