[jboss-user] [JBoss Microcontainer Development] - JBREFLECT-5 - Implementing generics in JavassistClassInfo

Kabir Khan do-not-reply at jboss.com
Tue Apr 27 14:26:59 EDT 2010


Kabir Khan [http://community.jboss.org/people/kabir.khan%40jboss.com] replied to the discussion

"JBREFLECT-5 - Implementing generics in JavassistClassInfo"

To view the discussion, visit: http://community.jboss.org/message/539875#539875

--------------------------------------------------------------
> Kabir Khan wrote:
> 
> One way around this would be in mi.getReturnType() when looking up/creating/caching the parameterized class info to use the classloader of mi.getDeclaringClass().getClassLoader(), which should be able to see all the classes involved. However, I am still stuck on which classloader to use for my previous post.
This works, however for "1 - other problem" I don't really see a way to determine the classloader. It could be the classloader of the raw type, or the loader of any of the class infos. It might be possible to determine which of the classloaders can see all the generic bounds by brute force, but that will probably
a) Be slow
b) Might not be possible, i.e. maybe none of the classloaders for any of the bounds are able to load everything.

I have tried turning off caching for these parameterized ClassInfos, which causes some of the tests to fail. From what I can see fixing them means having to adjust some of the tests to use assertEquals() instead of assertSame() for parameterized ClassInfos. I think this is necessary, and that the idea of enforcing object equality for parameterized ClassInfos is a misunderstanding :-)

Java itself does not seem to reuse the ParameterizedTypes, as shown by this simple passing test:

public class DeleteMe extends ContainerTest
{
   public DeleteMe(String name)
   {
      super(name);
   }
 
   public Set<String> m1(){return null;}
 
   public Set<String> m2(){return null;}
 
   public void testType() throws Exception
   {
      Type t1 = DeleteMe.class.getDeclaredMethod("m1").getGenericReturnType();
      Type t2 = DeleteMe.class.getDeclaredMethod("m1").getGenericReturnType();
 
      ParameterizedType p1 = assertInstanceOf(t1, ParameterizedType.class);
      ParameterizedType p2 = assertInstanceOf(t2, ParameterizedType.class);
 
      //The param are equal, but not the same
      assertEquals(p1, p2);
      assertNotSame(p1, p2);
 
      //The raw types are the same
      assertSame(p1.getRawType(), p2.getRawType());
      assertEquals(1, p1.getActualTypeArguments().length);
      assertEquals(1, p2.getActualTypeArguments().length);
      Class<?> clazz1 = assertInstanceOf(p1.getActualTypeArguments()[0], Class.class);
      Class<?> clazz2 = assertInstanceOf(p2.getActualTypeArguments()[0], Class.class);
      assertSame(clazz1, clazz2);
   }
}

 

--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/539875#539875]

Start a new discussion in JBoss Microcontainer Development at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2115]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20100427/ccfaea07/attachment.html 


More information about the jboss-user mailing list