ChainedParamReaderpublic class ChainedParamReader extends Object Description: In ParamReader class, user can not get inherited method parameter
from the class they passed in. This is done because of performance. This class
is intended to setup the inheritant chain. If the method could not be found in
the derived class, it will try to search it from super class, if not in the
immedidate super class it will search super class's super class, until it reaches
the root which is java.lang.Object. This is not an eager load since it only
start searching the super class when it is asked to
User: pengyu
Date: Sep 6, 2003
Time: 11:43:24 PM |
Fields Summary |
---|
private List | chain | private List | clsChain | private Map | methodToParamMap |
Constructors Summary |
---|
public ChainedParamReader(Class cls)Process a given class's parameter names
ParamReader reader = new ParamReader(cls);
chain.add(reader);
clsChain.add(cls);
|
Methods Summary |
---|
public java.lang.String[] | getParameterNames(java.lang.reflect.Constructor ctor)return the names of the declared parameters for the given constructor.
If we cannot determine the names, return null. The returned array will
have one name per parameter. The length of the array will be the same
as the length of the Class[] array returned by Constructor.getParameterTypes().
//there is no need for the constructor chaining.
return ((ParamReader) chain.get(0)).getParameterNames(ctor);
| public java.lang.String[] | getParameterNames(java.lang.reflect.Method method)return the names of the declared parameters for the given method.
If we cannot determine the names in the current class, we will try
to search its parent class until we reach java.lang.Object. If we
still can not find the method we will return null. The returned array
will have one name per parameter. The length of the array will be the same
as the length of the Class[] array returned by Method.getParameterTypes().
//go find the one from the cache first
if (methodToParamMap.containsKey(method)) {
return (String[]) methodToParamMap.get(method);
}
String[] ret = null;
for (Iterator it = chain.iterator(); it.hasNext();) {
ParamReader reader = (ParamReader) it.next();
ret = reader.getParameterNames(method);
if (ret != null) {
methodToParamMap.put(method, ret);
return ret;
}
}
//if we here, it means we need to create new chain.
Class cls = (Class) clsChain.get(chain.size() - 1);
while (cls.getSuperclass() != null) {
Class superClass = cls.getSuperclass();
try {
ParamReader _reader = new ParamReader(superClass);
chain.add(_reader);
clsChain.add(cls);
ret = _reader.getParameterNames(method);
if (ret != null) { //we found it so just return it.
methodToParamMap.put(method, ret);
return ret;
}
} catch (IOException e) {
//can not find the super class in the class path, abort here
return null;
}
}
methodToParamMap.put(method, ret);
return null;
|
|