I went with a slightly different solution, by Constructing the signature for the
java.lang.reflect.Method and check with org.apache.bcel.classfile.Method's
getSignature(). One
more use case we has was to construct a JavaClass given a java.lang.Class. See
BCEL.java at
http://cvs.apache.org/viewcvs.cgi/xml-axis/java/src/org/apache/axis/utils/bytecode/ on
how we got
around both problems.
Wish #1: Wish this was a helper method in JavaClass with the following Signature
public org.apache.bcel.classfile.Method getMethod(java.lang.reflect.Method).
Wish #2: Wish i could create a JavaClass from java.lang.Class as shown below.
Class clazz = Class.forName("XXXX");
ClassParser parser = new ClassParser(clazz);
JavaClass jclazz = parser.parse();
I can send in patches for both if anyone is interested.
Thanks,
dims
--- Juozas Baliuka <[EMAIL PROTECTED]> wrote:
>
> if declaring class is the same, you can loop and compare method names and
> argument type names returned from reflection and BCEL method representations.
>
>
> At 04:25 2002.06.12 -0700, Davanum Srinivas wrote:
> >Folks,
> >
> >Can someone help me port from serp/tt-bytecode to BCEL? We construct a
> >JavaClass from a
> >java.lang.Class (see code below). We have a java.lang.reflect.Method for
> >which we need to find
> >the corresponding org.apache.bcel.classfile.Method. How do i do it?
> >java.lang.reflect.Method's
> >toString() and org.apache.bcel.classfile.Method's toString() don't really
> >output the same stuff.
> >
> >We need to get this information to move Apache Axis
> >(http://xml.apache.org/axis/) from
> >Serp/tt-bytecode to BCEL.
> >
> >Thanks in Advance,
> >dims
> >
>
>>----------------------------------------------------------------------------------------------
> > /**
> > * Get Parameter Names using BCEL
> > *
> > * @param method the Java method we're interested in
> > * @return list of names or null
> > */
> > public String[]
> > getParameterNamesFromDebugInfo(java.lang.reflect.Method m) {
> > Class c = m.getDeclaringClass();
> > int numParams = m.getParameterTypes().length;
> > Vector temp = new Vector();
> >
> > // Don't worry about it if there are no params.
> > if (numParams == 0)
> > return null;
> >
> > // Try to obtain a tt-bytecode class object
> > JavaClass bclass = (JavaClass) clazzCache.get(c);
> >
> > if (bclass == null) {
> > try {
> > String className = c.getName();
> > String classFile = className.replace('.', '/');
> > InputStream is =
> > c.getClassLoader().getResourceAsStream(classFile
> > + ".class");
> >
> > ClassParser parser = new ClassParser(is, className);
> > bclass = parser.parse();
> >
> > clazzCache.put(c, bclass);
> > } catch (IOException e) {
> > // what now?
> > }
> > }
> >
> > Method[] methods = bclass.getMethods();
> > Method method = null;
> > // HOW DO I GET THE BCEL METHOD CORRESPONDING TO
> > // a java.lang.reflect.Method?
> > for (int i = 0; i < methods.length; i++) {
> > if (m.getName() == methods[i].getName() &&
> > m.toString().equals(methods[i].toString())) {
> > method = methods[i];
> > break;
> > }
> > }
> >
> > // Obtain the exact method we're interested in.
> > if (method == null)
> > return null;
> >
> > // Get the Code object, which contains the local variable table.
> > Code code = method.getCode();
> > if (code == null)
> > return null;
> >
> > LocalVariableTable attr = method.getLocalVariableTable();
> > if (attr == null)
> > return null;
> >
> > // OK, found it. Now scan through the local variables and record
> > // the names in the right indices.
> > LocalVariable[] vars = attr.getLocalVariableTable();
> >
> > String[] argNames = new String[numParams + 1];
> > argNames[0] = null; // don't know return name
> >
> > // NOTE: we scan through all the variables here, because I have been
> > // told that jikes sometimes produces unpredictable ordering of the
> > // local variable table.
> > for (int j = 0; j < vars.length; j++) {
> > LocalVariable var = vars[j];
> > if (!var.getName().equals("this")) {
> > if (temp.size() < var.getIndex() + 1)
> > temp.setSize(var.getIndex() + 1);
> > temp.setElementAt(var.getName(), var.getIndex());
> > }
> > }
> > int k = 0;
> > for (int j = 0; j < temp.size(); j++) {
> > if (temp.elementAt(j) != null) {
> > k++;
> > argNames[k] = (String) temp.elementAt(j);
> > if (k + 1 == argNames.length)
> > break;
> > }
> > }
> > return argNames;
> > }
>
>>----------------------------------------------------------------------------------------------
> >
> >=====
> >Davanum Srinivas - http://xml.apache.org/~dims/
> >
> >__________________________________________________
> >Do You Yahoo!?
> >Yahoo! - Official partner of 2002 FIFA World Cup
> >http://fifaworldcup.yahoo.com
> >
> >--
> >To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> >For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
=====
Davanum Srinivas - http://xml.apache.org/~dims/
__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.com
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>