This part gives me pause.  First, I don't really like this "in flight" creation of JavaTypeDescriptor instance.  Did you have an example where addDescriptor could not ('was not' is even a good start) be called ahead of time?  

And if "in flight" creation is needed for some edge cases, why aren't they cached by incoming type?  This code can be called quite often, which means we'd be creating a lot of these things and throwing them away every time.