After examining the BCEL source code (which was, at least for SyntheticRepository and ClassPath, a pretty nice experience) I have discovered that the SyntheticRepository implementation uses ClassPath.getInputStream(...) to obtain the binary. ClassPath.getInputStream(...) does not check the provided paths first; it checks the current system classloader.

Fortunately, ClassPath.getClassFile(...) errors out if the class is not in the explicitly-specified classpath entries. This means I should be able to write my own Repository implementation to get things working for my specific project. I just wanted to leave this explanation for anyone who might stumble into it in the archives. :)

Cheers, and thanks again for the impressive library!

- Zachary Palmer
Hi, all. I'm new to both the list and to BCEL, but it looks like precisely what I need for a research project on which I'm working. I need reflective access to the .class files which are on a given classpath without loading them into my JVM, so I've been experimenting with SyntheticRepository and ClassPath. I've written small test app and I'm getting results other than what I would expect. (e-mail continues below the following source)


import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.util.ClassPath;
import org.apache.bcel.util.Repository;
import org.apache.bcel.util.SyntheticRepository;

public class BCELTest
{
   public static void main(String[] arg) throws Exception
   {
       ClassPath cp = new ClassPath("/some/path/bin1");
       System.out.println(cp);
       Repository repo = SyntheticRepository.getInstance(cp);
       repo.clear();
       test(repo, "Test");
       test(repo, "BCELTest");
   }
public static void test(Repository repo, String className) throws Exception
   {
       JavaClass jc = repo.loadClass(className);
System.out.println("==============================================");
       System.out.println(jc);
   }
}


The BCELTest.class binary is located in /some/path/bin2; a hello-world-style Test.class binary is located in /some/path/bin1. I would expect the above program to run the first test successfully (loading Test.class and printing a summary of it) and then choke on the second (since /some/path/bin2 is not in the ClassPath I provided). However, my little test application successfully loads both classes. Why is this?

For the purposes of my project, I need to be able to reflectively analyze classes on a specified classpath (such as might be used when invoking the Java compiler) without accidentally polluting it with my own JVM's classpath. The above behavior has me a bit confused. Am I going about things wrong? Any suggestions are welcome.

And by the way, thanks for the incredible library. :) If all goes well, I'll have something to add to the "BCEL Projects" list.

Cheers,

Zachary Palmer



---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-user-unsubscr...@jakarta.apache.org
For additional commands, e-mail: bcel-user-h...@jakarta.apache.org

Reply via email to