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]>

Reply via email to