You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-user@jakarta.apache.org by Zachary Palmer <ze...@bahj.com> on 2010/01/22 22:18:58 UTC
Re: SyntheticRepository
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-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-user-help@jakarta.apache.org