`
dannyhz
  • 浏览: 387558 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jaxb 在new instance时候的调用classloader的方式

 
阅读更多

	private static JAXBContext createContext(Class<?> clazz) throws JAXBException {
		return JAXBContext.newInstance(clazz);
	}




        final String jaxbContextFQCN = JAXBContext.class.getName();
        String factoryClassName;

        // search for jaxb.properties in the class loader of each class first
        for (final Class c : classes) {
            // this classloader is used only to load jaxb.properties, so doing this should be safe.
            ClassLoader classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
                public ClassLoader run() {
                    return c.getClassLoader();
                }
            });
            Package pkg = c.getPackage();
            if(pkg==null)
                continue;       // this is possible for primitives, arrays, and classes that are loaded by poorly implemented ClassLoaders
            String packageName = pkg.getName().replace('.', '/');

            // TODO: do we want to optimize away searching the same package?  org.Foo, org.Bar, com.Baz
            //       classes from the same package might come from different class loades, so it might be a bad idea

            // TODO: it's easier to look things up from the class
            // c.getResourceAsStream("jaxb.properties");

            // build the resource name and use the property loader code
            String resourceName = packageName+"/jaxb.properties";
            logger.fine("Trying to locate "+resourceName);
            Properties props = loadJAXBProperties(classLoader, resourceName);
            if (props == null) {
                logger.fine("  not found");
            } else {
                logger.fine("  found");
                if (props.containsKey(JAXB_CONTEXT_FACTORY)) {
                    // trim() seems redundant, but adding to satisfy customer complaint
                    factoryClassName = props.getProperty(JAXB_CONTEXT_FACTORY).trim();
                    return newInstance(classes, properties, factoryClassName);
                } else {
                    throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, JAXB_CONTEXT_FACTORY));
                }
            }
        }

        // search for a system property second (javax.xml.bind.JAXBContext)
        logger.fine("Checking system property "+jaxbContextFQCN);
        factoryClassName = AccessController.doPrivileged(new GetPropertyAction(jaxbContextFQCN));
        if(  factoryClassName != null ) {
            logger.fine("  found "+factoryClassName);
            return newInstance( classes, properties, factoryClassName );
        }
        logger.fine("  not found");

        // search META-INF services next
        logger.fine("Checking META-INF/services");
        BufferedReader r;
        try {
            final String resource = new StringBuilder("META-INF/services/").append(jaxbContextFQCN).toString();
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            URL resourceURL;
            if(classLoader==null)
                resourceURL = ClassLoader.getSystemResource(resource);
            else
                resourceURL = classLoader.getResource(resource);

            if (resourceURL != null) {
                logger.fine("Reading "+resourceURL);
                r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));
                factoryClassName = r.readLine().trim();
                return newInstance(classes, properties, factoryClassName);
            } else {
                logger.fine("Unable to find: " + resource);
            }
        } catch (UnsupportedEncodingException e) {
            // should never happen
            throw new JAXBException(e);
        } catch (IOException e) {
            throw new JAXBException(e);
        }

        // else no provider found
        logger.fine("Trying to create the platform default provider");
        return newInstance(classes, properties, PLATFORM_DEFAULT_FACTORY_CLASS);




contextFinder

  private static Class safeLoadClass(String className, ClassLoader classLoader) throws ClassNotFoundException {
       logger.fine("Trying to load "+className);
       try {
          // make sure that the current thread has an access to the package of the given name.
          SecurityManager s = System.getSecurityManager();
          if (s != null) {
              int i = className.lastIndexOf('.');
              if (i != -1) {
                  s.checkPackageAccess(className.substring(0,i));
              }
          }
 
          if (classLoader == null) {
              return Class.forName(className);
          } else {
              return classLoader.loadClass(className);
          }
       } catch (SecurityException se) {
           // anyone can access the platform default factory class without permission
           if (PLATFORM_DEFAULT_FACTORY_CLASS.equals(className)) {
              return Class.forName(className);
           }
           throw se;
       }
    }

分享到:
评论

相关推荐

    Jaxb webservice java调用

    通过这样的方式,JAXB使得我们在Java中调用Web服务变得简单且直观,无需手动处理XML解析和序列化的复杂过程。在实际应用中,JAXB结合其他Java Web服务框架,如JAX-WS,可以构建强大的客户端和服务端应用。

    jaxb生成XML例子

    在给定的例子中,我们将深入理解如何使用JAXB注解来生成XML。 1. **@XmlType**: 这个注解用于定义类的属性在XML输出中的顺序。在`WriterXml`类中,propOrder 属性指定了"id", "name", "age", "book"这四个属性的...

    idea 中用jaxb 读xml中数据

    JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); ``` 4. **解析XML到Java对象**:使用Unmarshaller对象的`unmarshal`方法,...

    JAXB乱码问题解决

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到序列化和反序列化时,可能会遇到字符编码问题,即所谓的“乱码”。这个...

    JAXB的使用JAXB的使用

    JAXB提供了一种自动化的方式,将XML Schema映射为Java类,以及将Java对象转换成XML文档,反之亦然。这种映射机制极大地简化了处理XML数据的工作,特别是在企业级应用中,如数据交换、持久化存储等场景。 ### JAXB的...

    JAXB的 eclipse插件

    2. **Java类到XML的转换**:将已有的Java对象转换成XML文档,只需调用JAXB提供的API,即可轻松完成序列化过程。 3. **XML到Java对象的绑定**:通过JAXB,可以解析XML文档并创建相应的Java对象实例,这在处理XML输入...

    jaxb-api-2.1.jar

    在使用webservice,esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader错误.执行System.out.println(System.getProperty("java.endorsed.dirs"));输出jaxb-api-2.1.jar...

    JAXB的例子

    - 数据交换:在Web服务、API调用等场景下,JAXB常被用于JSON或XML数据的序列化和反序列化。 - 配置文件处理:在处理XML配置文件时,JAXB可以帮助快速地将配置数据映射为Java对象,方便操作和管理。 - XML文档生成:...

    jaxb解析生成xml

    1. **易用性**:JAXB提供了一种直观且易于理解的方式来处理XML,无需编写大量的DOM或SAX解析代码。 2. **性能**:由于JAXB是Java平台的标准部分,它通常比第三方库更快,因为它可以利用JVM的优化。 3. **自动类型...

    javax.rar(jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0)

    在Java开发环境中,`javax.rar`这一提及实际上与RAR压缩库无关,而是涉及到Java的XML绑定(JAXB)技术。标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java...

    JAVA JAXB 解析XML嵌套子节点为字符串

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个技术对于处理XML数据,尤其是解析和生成XML文档非常有用。当我们面临XML文档中存在嵌套子...

    jaxb-api-2.2 jaxb-impl

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误,按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in ...

    jaxb-api jaxb-impl jaxb-xjc jaxws-rt jar包

    这是JAXB的API接口,包含了所有必要的接口和抽象类,供开发者在项目中调用。比如`javax.xml.bind.JAXBContext`,它是整个JAXB框架的核心,负责创建上下文,解析XML到Java对象,或者将Java对象序列化成XML。`...

    JAXB2 jaxb-api.jar jaxb-xjc.jar jaxb-impl.jar activation.jar

    JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...

    JAXB的安装包及插件

    1. **添加JAXB库**:在Java项目中,可以通过以下方式引入JAXB库: - **Maven**:在`pom.xml`文件中添加依赖: ```xml &lt;groupId&gt;javax.xml.bind &lt;artifactId&gt;jaxb-api &lt;version&gt;2.3.1 ``` - **Gradle**:...

    jaxb-api jaxb-impl jar

    1. **jaxb-api.jar**: 这个库包含了JAXB API,即Java接口和抽象类,定义了JAXB的工作方式。它提供了必要的接口和类,如`javax.xml.bind.JAXBContext`, `Unmarshaller`, `Unmarshaller`, 和 `Validator`等,用于实现...

    JAXB的HelloWorld源码

    JAXBContext jaxbContext = JAXBContext.newInstance(HelloWorld.class); // 序列化 HelloWorld helloWorld = new HelloWorld(); helloWorld.setMessage("你好,世界!"); Marshaller marshaller = ...

    JAXB开发步骤

    = name;}@XmlElement(name="courses")public List&lt;Course&gt; getCourses() {return courses;}public void setCourses(List...在实际项目中,JAXB常用于Web服务、数据持久化或任何需要在Java对象和XML之间进行转换的场景。

    jaxb-api-2.1.jar 和 jaxb-impl-2.1.8.jar

    有时候,为了完整支持JAXB功能,可能还需要其他相关库,如`activation.jar`(JavaBeans Activation Framework)和`jsr173_api.jar`(Streaming XML API,StAX)。 **注意事项** 随着Java版本的更新,JAXB在Java 9及...

    Jaxb2 开发指南

    **Jaxb2 开发指南**\n\nJava对象与XML之间的转换是软件开发中常见的需求,Jaxb2提供了一种高效且便捷的方式来进行这种转换。本篇指南将详细介绍如何使用Jaxb2进行XML的转换和序列化。\n\n### 1. Jaxb2简介\n\nJaxb2...

Global site tag (gtag.js) - Google Analytics