0 Replies Latest reply on Sep 2, 2006 12:20 PM by dsperry

    Problem using ClassLoaders with Javassit (without the applic

    dsperry

      Hi All,

      There is problem with javassit and ClassLoaders for wich there is a solution, but involves changing javassit.ClassClassPath a little bit.

      = Here goes the problem: =

      I am using a special classloader to load an application wich I cannot change.
      This application uses javassit, so javassit ends up been loaded by my classloader.
      Usually this application runs without my classloader.

      Eventualy ClassPool.createCtClass("ClassX",..) is called and, later ClassClassPath.find. At this point javassit.NotFoundException occurs. See the error at the end of this post.


      = Here the scenario: =

      java.lang.Object is loaded by the System ClassLoader
      javassit.ClassClassPath is loaded by my ClassLoader
      ClassX is loaded by my ClassLoader

      But ClassClassPath asks to java.lang.Object where is the bytecode for "ClassX".


      = Here a comment from javassit.ClassClassPath constructor: =


      /* The value of thisClass was this.getClass() in early versions:
      *
      * thisClass = this.getClass();
      *
      * However, this made openClassfile() not search all the system
      * class paths if javassist.jar is put in jre/lib/ext/
      * (with JDK1.4).
      */
      this(java.lang.Object.class);

      Fine, but this created a new bug which is cited in other posts such as:
      "Javassist and Tomcat 4.1"
      http://jboss.com/index.html?module=bb&op=viewtopic&p=3902342
      "javassist.NotFoundException?: org.neo.swarmdesk.components.S"
      http://www.jboss.com/index.html?module=bb&op=viewtopic&t=33476
      "Re: Problems using custom ClassLoader" http://www.opensubscriber.com/message/hivemind-user@jakarta.apache.org/514059.html


      = Here a possible solution: =

      Assign thisClass=this.getClass() at the default constructor.
      Change the implementation of ClassClassPath.openClassfile and
      ClassClassPath.find to look for the bytecodes also at java.lang.Object.class.getResource() if the default
      constructor was called

      i.e: if the resource was not found and thisClass==this.getClass() then search for the resource with java.lang.Object.class.getResource()

      Regards and thanks in advance,

      Daniel Sperry

      ----

      Caused by: javassist.NotFoundException: com.hoplon.bitverse.handlers.HandlerCaller
      at javassist.ClassPool.get(ClassPool.java:389)
      at com.hoplon.bitverse.handlers.BytecodeHandler.createHandlerCaller(BytecodeHandler.java:117)
      ... 12 more