当前位置: 首页 > 面试题库 >

是否可以创建指向内存中对象的URL?

韩善
2023-03-14
问题内容

我正在尝试扩展库以进行集成,SwingJPA通过将JPAconfig设置为自动(可移植)来实现,这意味着以编程方式添加<class>元素。(我知道可以通过Hibernate
AnnotationConfiguration或EclipseLInk来实现ServerSession,但是-
可移植性)。我也想避免Spring仅用于此单一目的。

我可以动态创建一个persistence.xml,并用<class>指定包中的元素填充它(通过Reflections库)。当我尝试persistence.xml将其JPA提供给提供程序时,问题就开始了。我能想到的唯一方法是设置一个URLClassLoader,但我想不出什么方法使我无法将文件首先写入磁盘,这是唯一获得有效的能力URL。设置用于通过URLlocalhost:xxxx)提供文件服务的套接字似乎…我不知道,这是邪恶的吗?

有谁知道我该如何解决这个问题?我知道避免使用一个库听起来很麻烦,但我只想知道是否可以完成。

编辑 (尝试更清晰):

动态生成的XML内容保存在一个String对象中。我不知道如何将其提供给 持久性提供程序另外,我想避免将文件写入磁盘。

就我的问题而言, 持久性提供程序 只是一个在类路径中扫描的类META- INF/persistence.xml。可以使某些实现接受动态创建XML,但没有通用接口(尤其是文件的关键部分,即<class>标记)。

我的想法是建立一个自定义ClassLoader-如果您有其他需要的我将不胜感激,那么我就不会对此设置。

我能找到的唯一容易扩展/配置的是URLClassLoader。它可以在URL对象上运行,而且我不知道是否可以在不首先将XML实际写入磁盘的情况下创建对象。

这就是我进行设置的方式,但是通过将其写入persistenceXmlFile = new File("META- INF/persistence.xml")磁盘来工作:

Thread.currentThread().setContextClassLoader(
    new URLResourceClassLoader(
        new URL[] { persistenceXmlFile.toURI().toURL() },
        Thread.currentThread().getContextClassLoader()
    )
);

URLResourceClassLoaderURLCLassLoader的子类,它可以通过重写来查找资源和类public Enumeration<URL> findResources(String name)


问题答案:

也许有点晚了(4年后),但是对于其他正在寻找类似解决方案的人,您可以使用我创建的URL工厂:

public class InMemoryURLFactory {

    public static void main(String... args) throws Exception {
        URL url = InMemoryURLFactory.getInstance().build("/this/is/a/test.txt", "This is a test!");
        byte[] data = IOUtils.toByteArray(url.openConnection().getInputStream());
        // Prints out: This is a test!
        System.out.println(new String(data));
    }

    private final Map<URL, byte[]> contents = new WeakHashMap<>();
    private final URLStreamHandler handler = new InMemoryStreamHandler();

    private static InMemoryURLFactory instance = null;

    public static synchronized InMemoryURLFactory getInstance() {
        if(instance == null)
            instance = new InMemoryURLFactory();
        return instance;
    }

    private InMemoryURLFactory() {

    }

    public URL build(String path, String data) {
        try {
            return build(path, data.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException ex) {
            throw new RuntimeException(ex);
        }
    }

    public URL build(String path, byte[] data) {
        try {
            URL url = new URL("memory", "", -1, path, handler);
            contents.put(url, data);
            return url;
        } catch (MalformedURLException ex) {
            throw new RuntimeException(ex);
        }
    }

    private class InMemoryStreamHandler extends URLStreamHandler {

        @Override
        protected URLConnection openConnection(URL u) throws IOException {
            if(!u.getProtocol().equals("memory")) {
                throw new IOException("Cannot handle protocol: " + u.getProtocol());
            }
            return new URLConnection(u) {

                private byte[] data = null;

                @Override
                public void connect() throws IOException {
                    initDataIfNeeded();
                    checkDataAvailability();
                    // Protected field from superclass
                    connected = true;
                }

                @Override
                public long getContentLengthLong() {
                    initDataIfNeeded();
                    if(data == null)
                        return 0;
                    return data.length;
                }

                @Override
                public InputStream getInputStream() throws IOException {
                    initDataIfNeeded();
                    checkDataAvailability();
                    return new ByteArrayInputStream(data);
                }

                private void initDataIfNeeded() {
                    if(data == null)
                        data = contents.get(u);
                }

                private void checkDataAvailability() throws IOException {
                    if(data == null)
                        throw new IOException("In-memory data cannot be found for: " + u.getPath());
                }

            };
        }

    }
}


 类似资料:
  • 问题内容: 有什么方法可以从中创建对象吗? 我的要求是从RAR读取文件。我不是要写一个临时文件,而是要在RAR存档中找到一个文件。 问题答案: 您需要创建新文件并将内容复制到该文件: 我使用方便来避免手动复制流。它还具有内置缓冲。

  • 问题内容: 我想创建图像的base64内联编码数据,以便使用画布显示在表中。Python动态生成和创建网页。目前,python使用Image模块创建缩略图。创建所有缩略图后,Python然后生成每个缩略图的base64数据,并将b64数据放入用户网页的隐藏范围内。然后,用户单击每个缩略图相对于其兴趣的复选标记。然后,他们通过单击生成pdf按钮创建一个包含所选图像的pdf文件。使用jsPDF的Jav

  • 问题内容: 如何在Python中使类或方法抽象? 我尝试像这样重新定义: 但是现在,如果我创建一个像这样继承的类: 那么我也无法实例化,因为它调用了其超类的方法。 有没有更好的方法来定义抽象类? 问题答案: 使用该模块创建抽象类。使用装饰器来声明方法摘要,并根据您的Python版本使用以下三种方式之一声明类摘要。 在Python 3.4及更高版本中,您可以从继承。在Python的早期版本中,您需要

  • 问题内容: 是否可以创建内联伪样式? 例如,我可以做以下事情吗? 这背后的原因是我正在开发一个创建UI元素的.NET库。我想生成无需设置外部样式表即可设置其悬停状态的HTML元素。 问题答案: 不幸的是,不能,您不能使用内联CSS来实现悬停效果。 此问题的(较差)解决方法是让控件在呈现时呈现样式块。例如,您的控件可以呈现为: 如果您可以强迫用户在页面顶部放置“样式控件”,则可以在其中渲染所有自定义

  • 问题内容: 例如; 我正在使用此类: 如果我想创建N个点(originTwo,originThree … originN); 我可以使用像这样的for循环吗? 如果它是可能的; 我如何给他们起不同的名字? 问题答案: 您可以将它们放入数组。 他们会全部使用相同的,并在这些条件下。 如果你有数组和你可以做这样的: 如果您不喜欢数组,则可以使用列表: 您将其称为

  • 问题内容: 我有以下JNI方法,它可以本地创建Java对象的集合,然后将其返回给Java: 我需要释放用本机代码创建的对象,还是由GC自动完成?如果可以,我该如何将其返回Java? 问题答案: 您不需要释放在本机代码中创建的Java对象。实际上,您不能。当没有其他引用时,垃圾收集器可以释放对象。 有时在本机代码中释放对Java对象的 引用 很有用。当本机代码保存但不再需要对大型对象的引用或大量引用