Re: AW: Re: Lookup BCEL Method for a particular java.lang.reflect.Method / Create JavaClass from java.lang.Class

Davanum Srinivas <[email protected]>
Newsgroups gmane.comp.jakarta.bcel.devel
Message-ID <[email protected]>
Markus,

- I had downloaded bcel-5.0rc1 which did not have the SyntheticRepository.
- The enclosed patch 
  - Adds a getMethod in JavaClass...
  - Adds an entry in the manifest to make my Ant happy.
- When is RC2? 

Thanks,
dims

--- [email protected] wrote:
> 
> > 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();
> 
> You can already do this: 
> SyntheticRepository.getInstance().loadClass(clazz);
> 
> using the repository is the preferred way anyway.
> 
> > I can send in patches for both if anyone is interested.
> 
> Yes.
> 
> Cheers
>  Markus
> --
> berlin.de - meine stadt im netz. Jetzt eigene eMail-adresse @berlin.de sichern!
> http://webmail.berlin.de
> 
> 
> --
> 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]>
bcel.txt (text/plain, 4.3 KB)
cvs server: Diffing .
Index: manifest.txt
===================================================================
RCS file: /home/cvspublic/jakarta-bcel/manifest.txt,v
retrieving revision 1.1
diff -u -r1.1 manifest.txt
--- manifest.txt	18 Apr 2002 07:52:13 -0000	1.1
+++ manifest.txt	12 Jun 2002 16:21:13 -0000
@@ -1,2 +1,4 @@
-Manifest-Version: 1.0

-Main-Class: listclass

+Name: BCEL
+Manifest-Version: 1.0
+Main-Class: listclass
+
cvs server: Diffing docs
cvs server: Diffing docs/eps
cvs server: Diffing docs/verifier
cvs server: Diffing examples
cvs server: Diffing examples/Mini
cvs server: Diffing lib
cvs server: Diffing src
cvs server: Diffing src/java
cvs server: Diffing src/java/org
cvs server: Diffing src/java/org/apache
cvs server: Diffing src/java/org/apache/bcel
cvs server: Diffing src/java/org/apache/bcel/classfile
Index: src/java/org/apache/bcel/classfile/JavaClass.java
===================================================================
RCS file: /home/cvspublic/jakarta-bcel/src/java/org/apache/bcel/classfile/JavaClass.java,v
retrieving revision 1.9
diff -u -r1.9 JavaClass.java
--- src/java/org/apache/bcel/classfile/JavaClass.java	6 Jun 2002 11:35:43 -0000	1.9
+++ src/java/org/apache/bcel/classfile/JavaClass.java	12 Jun 2002 16:21:13 -0000
@@ -403,7 +403,20 @@
   /**
    * @return Methods of the class.
    */
-  public Method[] getMethods()       { return methods; }    
+  public Method[] getMethods()       { return methods; }
+
+  /**
+   * @return A org.apache.bcel.classfile.Method corresponding to java.lang.reflect.Method
+   */
+  public org.apache.bcel.classfile.Method getMethod(java.lang.reflect.Method m) {
+      for (int i = 0; i < methods.length; i++) {
+          if (m.getName().equals(methods[i].getName()) &&
+                  getSignature(m).equals(methods[i].getSignature())) {
+              return methods[i];
+          }
+      }
+      return null;
+  }
 
   /**
    * @return Minor number of compiler version.
@@ -794,4 +807,63 @@
 	    
     return vec.toArray();
   }
+
+    /**
+     * Compute the JVM signature for the class.
+     */
+    private String getSignature(Class clazz) {
+        String type = null;
+        if (clazz.isArray()) {
+            Class cl = clazz;
+            int dimensions = 0;
+            while (cl.isArray()) {
+                dimensions++;
+                cl = cl.getComponentType();
+            }
+            StringBuffer sb = new StringBuffer();
+            for (int i = 0; i < dimensions; i++) {
+                sb.append("[");
+            }
+            sb.append(getSignature(cl));
+            type = sb.toString();
+        } else if (clazz.isPrimitive()) {
+            if (clazz == Integer.TYPE) {
+                type = "I";
+            } else if (clazz == Byte.TYPE) {
+                type = "B";
+            } else if (clazz == Long.TYPE) {
+                type = "J";
+            } else if (clazz == Float.TYPE) {
+                type = "F";
+            } else if (clazz == Double.TYPE) {
+                type = "D";
+            } else if (clazz == Short.TYPE) {
+                type = "S";
+            } else if (clazz == Character.TYPE) {
+                type = "C";
+            } else if (clazz == Boolean.TYPE) {
+                type = "Z";
+            } else if (clazz == Void.TYPE) {
+                type = "V";
+            }
+        } else {
+            type = "L" + clazz.getName().replace('.', '/') + ";";
+        }
+        return type;
+    }
+
+    /*
+     * Compute the JVM method descriptor for the method.
+     */
+    private String getSignature(java.lang.reflect.Method meth) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("(");
+        Class[] params = meth.getParameterTypes(); // avoid clone
+        for (int j = 0; j < params.length; j++) {
+            sb.append(getSignature(params[j]));
+        }
+        sb.append(")");
+        sb.append(getSignature(meth.getReturnType()));
+        return sb.toString();
+    }
 }
cvs server: Diffing src/java/org/apache/bcel/generic
cvs server: Diffing src/java/org/apache/bcel/util
cvs server: Diffing src/java/org/apache/bcel/verifier
cvs server: Diffing src/java/org/apache/bcel/verifier/exc
cvs server: Diffing src/java/org/apache/bcel/verifier/statics
cvs server: Diffing src/java/org/apache/bcel/verifier/structurals
cvs server: Diffing xdocs
cvs server: Diffing xdocs/images
cvs server: Diffing xdocs/stylesheets
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.