首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在每个方法调用中使用newInstance()创建newInstance()是正确的吗?

在每个方法调用中使用newInstance()创建newInstance()是正确的吗?
EN

Stack Overflow用户
提问于 2018-10-24 00:16:42
回答 1查看 753关注 0票数 0

在spring项目中,我创建了JAXBContext bean:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class MarshallerConfig {

    @Bean
    JAXBContext jaxbContext() throws JAXBException {
        return JAXBContext.newInstance(my packages);
    }
}

我创建包装器来使用这个上下文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MarshallerImpl implements Marshaler {

    private final JAXBContext jaxbContext;

    public MarshallerImpl(JAXBContext jaxbContext) {
        this.jaxbContext = jaxbContext;
    }

     //murshall and unmarshal methosds imlementation
    }

当我像bean一样创建JAXBContext时,我知道这个JAXBContext将是单例的。但是现在我需要在没有@XMLRootElement注释的情况下为marshall元素实现marhall方法。我在这个文章中实现了它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public <T> String marshalToStringWithoutRoot(T value, Class<T> clazz) {
    try {
        StringWriter stringWriter = new StringWriter();

        JAXBContext jc = JAXBContext.newInstance(clazz);
        Marshaller marshaller = jc.createMarshaller();
        // format the XML output
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);

        QName qName = new QName(value.getClass().getPackage().toString(), value.getClass().getSimpleName());
        JAXBElement<T> root = new JAXBElement<>(qName, clazz, value);

        marshaller.marshal(root, stringWriter);

        return stringWriter.toString();
    } catch (JAXBException e) {
        throw new RuntimeException(e.getMessage());
    }
}

我将JAXBContext创建为JAXBContext jc = JAXBContext.newInstance(clazz);方法。

--它有多正确?每次使用newInstance**?**创建对象时

我在这个方法里面看了一下,没有发现它是单例的。

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 01:53:15

因为创建JAXBContext非常耗时,所以您应该尽可能地避免它。

您可以通过在Map<Class<?>, JAXBContext>中缓存它们来实现这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Map<Class<?>, JAXBContext> contextsByRootClass = new HashMap<>();

private static JAXBContext getJAXBContextForRoot(Class<?> clazz) throws JAXBException {
    JAXBContext context = contextsByRootClass.get(clazz);
    if (context == null) {
        context = JAXBContext.newInstance(clazz);
        contextsByRootClass.put(clazz, context);
    }
    return context;
}

最后,在marshalToStringWithoutRoot方法中,您可以替换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JAXBContext jc = JAXBContext.newInstance(clazz);

通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JAXBContext jc = getJAXBContextForRoot(clazz);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52964044

复制
相关文章
Class.newInstance与Constructor.newInstance对比
java创建对象有五种方式,这篇文介绍其中两种,Class.newInstance与Constructor.newInstance都是通过反射创建java对象实例的,这两种方式主要不同之处如下:
johnhuster的分享
2022/03/28
4320
Java中newInstance()和new()区别
上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C , D….等,只要他们继承Ainterface就可以。
小黑同学
2020/11/24
4640
Protobuf在Cmake中的正确使用
Protobuf是google开发的一个序列化和反序列化的协议库,我们可以自己设计传递数据的格式,通过.proto文件定义我们的要传递的数据格式。例如,在深度学习中常用的ONNX交换模型就是使用.proto编写的。我们可以通过多种前端(MNN、NCNN、TVM的前端)去读取这个.onnx这个模型,但是首先你要安装protobuf。
老潘
2023/10/19
1.7K0
Protobuf在Cmake中的正确使用
你确定你的批量方法插入是正确的吗?
各位小伙伴好久不见,时光荏苒,不知不觉已经来到了寒风刺骨的冬天,今天出门差点把自己冻废在路上。在这寒冷的冬天,我带着我对程序探究的热情,来温暖这个寒冷的冬天。虽然好久不见,迫于生计,还是要一有时间就要总结的。
麦洛
2021/08/23
9610
你确定你的批量方法插入是正确的吗?
创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?
问题:为什么创建A对象的时候父类会调用子类方法? 但是:创建B对象父类会调用父类的方法?
zhangheng
2020/04/28
6.2K0
结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
很久没有写博了,今天一个同学在问结构变量的问题,问结构到底是传递值还是传递引用。查过MSDN的都知道,结构默认是传递值的,因此在方法内部,结构的值会被复制一份。但是对于结构数组,如果值还是要被复制一份,这个内存占用是不是很多了呢? 一般来说,数组参数传递的是引用,那么数组的元素呢?它是被复制的还是被引用的?如果结构数组的元素象结构变量那样也是复制的,那么对于方法调用的内存占用问题,就得好好考虑下了。 MSDN看了半天,也讨论了半天,感觉还是没有动手实验最有说服力,我们先定义一个结构体: struct Poi
用户1177503
2018/02/26
2.5K0
在OrderStatusActor构造方法中调用StartTimerAsync
TimerCallbackAsync方法以二进制形式接收用户状态。 在示例中,回调在将状态写入日志之前将状态 string 解码回 。
用户7108768
2021/09/26
1.9K0
在Servlet的init方法中创建线程
 servlet代码如下: package com.weichat.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.se
庞小明
2018/03/07
2.8K0
在PHP中strpos函数的正确使用方式
首先简单介绍下 strpos 函数,strpos 函数是查找某个字符在字符串中的位置,这里需要明确这个函数的作用,这个函数得到的是位置。 如果存在,返回数字,否则返回的是 false。 而很多时候我们拿这个函数用来判断字符串中是否存在某个字符,一些同学使用的姿势是这样的 // 判断‘沈唁志博客’中是否存在‘博客’这个词 if (strpos('沈唁志博客', '博客')) { // 如果存在执行此处代码 echo '存在'; }else{ // 如果不存在执行此处代码 e
沈唁
2018/05/24
5.2K0
关于使用MethodHandle在子类中调用祖父类重写方法的探究
这里直接看Son类的thinking方法(关于为何这样实现,在《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)中也解释了)。
Java架构师必看
2021/11/29
9.5K0
深入理解Java对象的创建过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。
Java团长
2018/08/03
3.1K0
一个对象的前世今生
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。
Bug开发工程师
2018/07/23
4880
一个对象的前世今生
在AppCode中的razor调用HtmlHelper方法和UrlHelper方法
using System.Web.WebPages; using System.Web.Mvc;
javascript.shop
2019/09/04
2K0
正确的使用python调用shell的姿势
python是一门简洁灵活的语言,也是一门胶水语言,能与很多其他的编程语言进行交互,虽然性能差一点,但易用,入门和上手都比较简单,所以一直以来都被使用广泛。
我是攻城师
2020/04/22
7.5K0
深入理解Java对象的创建过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。
用户7886150
2020/12/07
2.7K0
点击加载更多

相似问题

如何正确调用newInstance方法?

114

使用newInstance方法的Mockito

11

使用newInstance方法的有效方法

13

无法解析方法newinstance()

24

使用Gradle Kotlin DSL创建TransformerFactory.newInstance().newTransformer()的正确方法

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文