WARNING: This server is unstable and will be retired in the next days.
If you want to keep this forum available, please request immediately a migration
on the Nabble Support forum.
Forums that don't receive any migration request will be deleted forever.
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");
> Repository repo = SyntheticRepository.getInstance(cp);
> test(repo, "Test");
> test(repo, "BCELTest");
> public static void test(Repository repo, String className) throws
> JavaClass jc = repo.loadClass(className);
> 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.
> Zachary Palmer