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()?