为什么需要特别讲述JAXBContext关于包中已有的类? [英] Why does JAXBContext need to be told specifically about a class that is already in the package?

查看:208
本文介绍了为什么需要特别讲述JAXBContext关于包中已有的类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此程序:

import foo.bar.baz.ClassSpecificallyIncluded;  
import javax.xml.bind.JAXBContext;  
public class A {  
    public static void main(String[] args) throws Exception {  
        System.out.println(JAXBContext.newInstance(ClassSpecificallyIncluded.class).toString());  
        System.out.println(JAXBContext.newInstance("foo.bar.baz").toString());  
    }  
}  

为第一个和第二个JAXBContext产生不同的输出:

produces different output for the first and second JAXBContext:


jar:file:/ C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar !/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id:1.0

此上下文已知的类:

[B

boolean

byte

char

foo.bar.baz.Class1

foo.bar.baz.Class1 $ NestedClass

foo.bar.baz.Class2

foo.bar.baz.ClassSpecificallyIncluded

foo.bar.baz.AnotherClass

com.sun .xml.bind.api.CompositeStructure

double

float

int

java.awt.Image

java.io.File

java.lang.Boolean

java.lang.Byte

java.lang.Character

java .lang.Class

java.lang.Double

java.lang.Float

java.lang.Integer

java.lang .Long

jav a.lang.Object

java.lang.Short

java.lang.String

java.lang.Void

java。 math.BigDecimal

java.math.BigInteger

java.net.URI

java.net.URL

java.util。日历

java.util.Date

java.util.GregorianCalendar

java.util.UUID

javax.activation.DataHandler < br>
javax.xml.bind.JAXBElement

javax.xml.datatype.Duration

javax.xml.datatype.XMLGregorianCalendar

javax。 xml.namespace.QName

javax.xml.transform.Source

long

short

void

jar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.0
Classes known to this context:
[B
boolean
byte
char
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
foo.bar.baz.Class2
foo.bar.baz.ClassSpecificallyIncluded
foo.bar.baz.AnotherClass
com.sun.xml.bind.api.CompositeStructure
double
float
int
java.awt.Image
java.io.File
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.lang.Void
java.math.BigDecimal
java.math.BigInteger
java.net.URI
java.net.URL
java.util.Calendar
java.util.Date
java.util.GregorianCalendar
java.util.UUID
javax.activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.datatype.Duration
javax.xml.datatype.XMLGregorianCalendar
javax.xml.namespace.QName
javax.xml.transform.Source
long
short
void

jar:file:/ C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/ com / sun / xml / bind / v2 / runtime /JAXBContextImpl.class Build-Id:1.0

此上下文已知的类:

[B

boolean

byte

char

foo.bar.baz.Class1

foo.bar.baz.Class1 $ NestedClass

foo。 bar.baz.Class2

<<< CLASS在这里遗失>>>

foo.bar.baz.AnotherClass

com.sun.xml.bind.api.CompositeStructure

double

float

int

java.awt.Image

java.io.File

java。 lang.Boolean

java.lang.Byte

java.lang.Character

java.lang.Class

java.lang。 Double

java.lang.Float

java.lang.Integer

java.lang.Long

java.lang.Object < br>
java.lang.Short

java.lang.String

java.lang.Void

java.math.BigDecimal

java.math.BigInteger

java.net.URI

java.net.URL

java.util.Calendar

java.util.Date

java.util.GregorianCalendar

java.util.UUID

javax.activation.DataHandler

javax.xml.bind.JAXBElement

javax.xml.datatype.Duration

javax.xml.datatype.XMLGregorianCalendar

jav ax.xml.namespace.QName

javax.xml.transform.Source

long

short

void

jar:file:/C:/dev/trunk/rt/tomcat/shared/lib/webservices-rt-2.0.1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.0
Classes known to this context:
[B
boolean
byte
char
foo.bar.baz.Class1
foo.bar.baz.Class1$NestedClass
foo.bar.baz.Class2
<<< CLASS IS MISSING HERE>>>
foo.bar.baz.AnotherClass
com.sun.xml.bind.api.CompositeStructure
double
float
int
java.awt.Image
java.io.File
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.lang.Void
java.math.BigDecimal
java.math.BigInteger
java.net.URI
java.net.URL
java.util.Calendar
java.util.Date
java.util.GregorianCalendar
java.util.UUID
javax.activation.DataHandler
javax.xml.bind.JAXBElement
javax.xml.datatype.Duration
javax.xml.datatype.XMLGregorianCalendar
javax.xml.namespace.QName
javax.xml.transform.Source
long
short
void

然而,ClassSpecificallyIncluded位于foo.bar.baz包中:

And yet, ClassSpecificallyIncluded is in the foo.bar.baz package:

//  
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6   
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>   
// Any modifications to this file will be lost upon recompilation of the source schema.   
// Generated on: 2012.05.14 at 10:47:17 PM IST   
//  

package foo.bar.baz;  

import javax.xml.bind.annotation.XmlAccessType;  
import javax.xml.bind.annotation.XmlAccessorType;  
import javax.xml.bind.annotation.XmlElement;  
import javax.xml.bind.annotation.XmlRootElement;  


@XmlAccessorType(XmlAccessType.FIELD)  
@XmlType(name = "", propOrder = {  
    "applicationArea",  
    "dataArea"  
})  
@XmlRootElement(name = "ClassSpecificallyIncluded")  
public class ClassSpecificallyIncluded {...  

类路径和类加载器对于两个JAXBContex都是相同的。

The classpath and classloader are the same for both JAXBContexts.

那么为什么第二个JAXBContext不知道ClassSpecificallyIncluded?

So why doesn’t the second JAXBContext know about ClassSpecificallyIncluded?

推荐答案

您的问题的答案在这里得到有效解答:

The answer to your question is effectively answered here:

您能否使用反射找到包中的所有类?

答案:
否按设计,java不知道,也找不到包中的每个类。 Java建立在及时的概念之上。为此目的意味着java在获得特定内容之前不知道它是什么。

Answer: No By design, java doesn't know and can't find every class in a package. Java is built on the concept of "Just in time". Which for this purpose means that java doesn't know what it's got until it's asked for something specifically.

所以从这个角度来看,JAXB无法找到哪些类在一个包中。

So from that stand point, JAXB has no way to find what classes are in a package.

如果每次需要上下文时都必须准确地告诉JAXB每个班级,那将是不方便的。因此,作为一种便捷方法,JAXB为您提供了提供包名称的选项。

It would be inconvenient if JAXB had to be told precisely every class every time you needed context. So as a convenience method JAXB offers you the option of providing a package name.

为了绕过java的限制,它试图从该包加载 ObjectFactory 和一个 jaxb.in​​dex 文件。它可以这样做,因为它们是特定的名称。如果找到一个,那么它将它们用作包的清单。如果两者都找不到,它就没有选择,只能中止,因为它不可能知道包中的内容。

In order to get round the limitations of java it attempts to load from that package an ObjectFactory and a jaxb.index file. It can do this because they are specific names. If one is found, then it uses them as a manifest for the package. If neither is found it has no option but to abort because it can't possibly know what's in the package.

这篇关于为什么需要特别讲述JAXBContext关于包中已有的类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆