3 Replies Latest reply on Feb 25, 2010 6:35 AM by Arvind K

    Remove an interface from a Class

    Kevin Kilroy Newbie



      Is it possible to remove an interface from a class?




      public class SomeClass implements SomeInterface, AnotherInterface




      Thanks in advance!


        • 1. Re: Remove an interface from a Class
          Arvind K Newbie

          How I approached this:


          I obtained the list of interface CtClasses using CtClass.getInterfaces();


          I removed the Interface I chose from the list of CtClasses. Then I applied the filtered list of interfaces onto the CtClass using CtClass.setInterfaces() and passed in the filtered CtClass Array of Interfaces to that method. Tested this with a simple example.

          • 2. Re: Remove an interface from a Class
            Kevin Kilroy Newbie



            Could you provide an example please? I'm receiving the following exception:


            java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class definition


            With this code:


            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get("com.northwales.ilm.domain.ContextBarItem");
            CtClass[] ifs = cc.getInterfaces();
            CtClass[] newIfs = new CtClass[1];
            newIfs[0] = ifs[0];
            Class newClass = cc.toClass();
            ContextBarItem cbi = (ContextBarItem)newClass.newInstance();





            • 3. Re: Remove an interface from a Class
              Arvind K Newbie



              I do not think there should be anything wrong with the interface-removing part. You can verify this by printing the interface class names before and after you change them, if you need. I can think of 2 possibilities for the exception:


              I would put my money on this one:

              1. You are trying to modify a class that has already been loaded. This is not allowed by the JVM. You might have seen this thread in a forum that posts your same error: http://lists.jboss.org/pipermail/jboss-user/2009-March/152559.html. You might want to modify your class during load time in this case using a javaagent and classfiletransformer (or some other approach).


              2. You might need a different context class loader to load the ContextBarItem class. The default CtClass.toClass() uses the context class loader of the current thread. You could use an overloaded Class:

              public java.lang.Class toClass(java.lang.ClassLoader loader,
                                             java.security.ProtectionDomain domain)
                                      throws CannotCompileException

              suppose the object of ContextBarItem class is myCBI,

              Class newClass = cc.toClass(myCBI.getClass().getClassloader(), myCBI.getClass().getProtectionDomain());


              Check out http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#toclass and Javassist API for more details. I'm not too clear on these concepts either.