mdahm 2002/06/06 04:35:43
Modified: src/java/org/apache/bcel/classfile JavaClass.java
Log:
Added repository functionality
Revision Changes Path
1.9 +151 -76 jakarta-bcel/src/java/org/apache/bcel/classfile/JavaClass.java
Index: JavaClass.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/classfile/JavaClass.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JavaClass.java 3 Jun 2002 09:06:37 -0000 1.8
+++ JavaClass.java 6 Jun 2002 11:35:43 -0000 1.9
@@ -55,8 +55,7 @@
*/
import org.apache.bcel.Constants;
-// import org.apache.bcel.Repository;
-import org.apache.bcel.util.Repository;
+import org.apache.bcel.Repository;
import org.apache.bcel.util.SyntheticRepository;
import org.apache.bcel.util.ClassVector;
import org.apache.bcel.util.ClassQueue;
@@ -74,7 +73,7 @@
* class file. Those interested in programatically generating classes
* should see the <a href="../generic/ClassGen.html">ClassGen</a> class.
- * @version $Id: JavaClass.java,v 1.8 2002/06/03 09:06:37 mdahm Exp $
+ * @version $Id: JavaClass.java,v 1.9 2002/06/06 11:35:43 mdahm Exp $
* @see org.apache.bcel.generic.ClassGen
* @author <A HREF="mailto:[EMAIL PROTECTED]">M. Dahm</A>
*/
@@ -102,13 +101,13 @@
static boolean debug = false; // Debugging on/off
static char sep = '/'; // directory separator
- /**
- * In cases where we go ahead and create something,
- * use the default SyntheticRepository, because we
- * don't know any better.
- */
- private org.apache.bcel.util.Repository repository =
- SyntheticRepository.getInstance();
+ /**
+ * In cases where we go ahead and create something,
+ * use the default SyntheticRepository, because we
+ * don't know any better.
+ */
+ private org.apache.bcel.util.Repository repository =
+ SyntheticRepository.getInstance();
/**
* Constructor gets all contents as arguments.
@@ -170,7 +169,7 @@
break;
}
}
-
+
/* According to the specification the following entries must be of type
* `ConstantClass' but we check that anyway via the
* `ConstPool.getConstant' method.
@@ -289,11 +288,10 @@
try {
dump(ds);
- ds.close();
} catch(IOException e) {
e.printStackTrace();
} finally {
- try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); }
+ try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); }
}
return s.toByteArray();
@@ -393,9 +391,9 @@
public String[] getInterfaceNames() { return interface_names; }
/**
- * @return Implemented interfaces.
+ * @return Indices in constant pool of implemented interfaces.
*/
- public int[] getInterfaces() { return interfaces; }
+ public int[] getInterfaceIndices() { return interfaces; }
/**
* @return Major number of compiler version.
@@ -440,7 +438,7 @@
if(sep != null)
try {
JavaClass.sep = sep.charAt(0);
- } catch(StringIndexOutOfBoundsException e) {} // Never reached
+ } catch(StringIndexOutOfBoundsException e) {} // Never reached
}
/**
@@ -635,10 +633,6 @@
return c;
}
- public final boolean instanceOf(JavaClass super_class) {
- return org.apache.bcel.Repository.instanceOf(this, super_class);
- }
-
public final boolean isSuper() {
return (access_flags & Constants.ACC_SUPER) != 0;
}
@@ -653,70 +647,151 @@
return source;
}
- // Added on 4/16/2002 to deprecate the old Repository class. -- DDP
+ /********************* New repository functionality *********************/
- /**
- * Gets the ClassRepository which holds its definition.
- */
- public org.apache.bcel.util.Repository getRepository() {
- return repository;
+ /**
+ * Gets the ClassRepository which holds its definition. By default
+ * this is the same as SyntheticRepository.getInstance();
+ */
+ public org.apache.bcel.util.Repository getRepository() {
+ return repository;
+ }
+
+ /**
+ * Sets the ClassRepository which loaded the JavaClass.
+ * Should be called immediately after parsing is done.
+ */
+ public void setRepository(org.apache.bcel.util.Repository repository) {
+ this.repository = repository;
+ }
+
+ /** Equivalent to runtime "instanceof" operator.
+ *
+ * @return true if this JavaClass is derived from teh super class
+ */
+ public final boolean instanceOf(JavaClass super_class) {
+ if(this.equals(super_class))
+ return true;
+
+ JavaClass[] super_classes = getSuperClasses();
+
+ for(int i=0; i < super_classes.length; i++) {
+ if(super_classes[i].equals(super_class)) {
+ return true;
+ }
}
- /**
- * Sets the ClassRepository which loaded the JavaClass.
- * Should be called immediately after parsing is done.
- */
- public void setRepository( org.apache.bcel.util.Repository repository ) {
- this.repository = repository;
+ if(super_class.isInterface()) {
+ return implementationOf(super_class);
}
- /**
- * Get the Superclass for this JavaClass object.
- */
- public JavaClass getSuperclass() {
- try {
- return repository.loadClass( getSuperclassName() );
- } catch (ClassNotFoundException cnfe) {
- System.err.println("WARNING: Could not find Superclass.");
- cnfe.printStackTrace();
- return null;
- }
+ return false;
+ }
+
+ /**
+ * @return true, if clazz is an implementation of interface inter
+ */
+ public boolean implementationOf(JavaClass inter) {
+ if(!inter.isInterface()) {
+ throw new IllegalArgumentException(inter.getClassName() + " is no interface");
}
- /**
- * Get all interfaces implemented by the JavaClass object.
- */
- public JavaClass [] getAllInterfaces() {
- try {
- ClassQueue queue = new ClassQueue();
- ClassVector vec = new ClassVector();
-
- queue.enqueue( this );
-
- while (!queue.empty()) {
- JavaClass clazz = queue.dequeue();
+ if(this.equals(inter)) {
+ return true;
+ }
- JavaClass souper = clazz.getSuperclass();
- String interfaces[] = clazz.getInterfaceNames();
-
- if (clazz.isInterface()) {
- vec.addElement( clazz );
- } else {
- if (souper != null) {
- queue.enqueue( souper );
- }
- }
-
- for (int i = 0; i < interfaces.length; i++) {
- queue.enqueue( repository.loadClass( interfaces[i] ));
- }
- }
-
- return vec.toArray();
- } catch (ClassNotFoundException cnfe) {
- System.err.println("WARNING: Class not found.");
- cnfe.printStackTrace();
- return null;
+ JavaClass[] super_interfaces = getAllInterfaces();
+
+ for(int i=0; i < super_interfaces.length; i++) {
+ if(super_interfaces[i].equals(inter)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @return the superclass for this JavaClass object, or null if this
+ * is java.lang.Object
+ */
+ public JavaClass getSuperClass() {
+ if("java.lang.Object".equals(getSuperclassName())) {
+ return null;
+ }
+
+ try {
+ return repository.loadClass(getSuperclassName());
+ } catch(ClassNotFoundException e) {
+ System.err.println(e);
+ return null;
+ }
+ }
+
+ /**
+ * @return list of super classes of this class in ascending order, i.e.,
+ * java.lang.Object is always the last element
+ */
+ public JavaClass[] getSuperClasses() {
+ JavaClass clazz = this;
+ ClassVector vec = new ClassVector();
+
+ for(clazz = clazz.getSuperClass(); clazz != null;
+ clazz = clazz.getSuperClass())
+ {
+ vec.addElement(clazz);
+ }
+
+ return vec.toArray();
+ }
+
+ /**
+ * Get interfaces directly implemented by this JavaClass.
+ */
+ public JavaClass[] getInterfaces() {
+ String[] interfaces = getInterfaceNames();
+ JavaClass[] classes = new JavaClass[interfaces.length];
+
+ try {
+ for(int i = 0; i < interfaces.length; i++) {
+ classes[i] = repository.loadClass(interfaces[i]);
+ }
+ } catch(ClassNotFoundException e) {
+ System.err.println(e);
+ return null;
+ }
+
+ return classes;
+ }
+
+ /**
+ * Get all interfaces implemented by this JavaClass (transitively).
+ */
+ public JavaClass[] getAllInterfaces() {
+ ClassQueue queue = new ClassQueue();
+ ClassVector vec = new ClassVector();
+
+ queue.enqueue(this);
+
+ while(!queue.empty()) {
+ JavaClass clazz = queue.dequeue();
+
+ JavaClass souper = clazz.getSuperClass();
+ JavaClass[] interfaces = clazz.getInterfaces();
+
+ if(clazz.isInterface()) {
+ vec.addElement(clazz);
+ } else {
+ if(souper != null) {
+ queue.enqueue(souper);
}
+ }
+
+ for(int i = 0; i < interfaces.length; i++) {
+ queue.enqueue(interfaces[i]);
+ }
}
+
+ return vec.toArray();
+ }
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>