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.

Re: SyntheticRepository

View: New views
1 Messages — Rating Filter:   Alert me  

Parent Message unknown Re: SyntheticRepository

by Zachary Palmer-7 :: Rate this Message:

| View Threaded | Show Only this Message

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@...
For additional commands, e-mail: bcel-user-help@...