java import url类_从Java中的类路径加载资源的URL

小编典典

介绍和基本实现

首先,你将至少需要一个URLStreamHandler。这实际上将打开与给定URL的连接。注意,这简称为Handler; 这样你就可以指定java -Djava.protocol.handler.pkgs=org.my.protocols它,并且使用“简单”程序包名称作为受支持的协议(在这种情况下为“ classpath”)将自动将其提取。

用法

new URL("classpath:org/my/package/resource.extension").openConnection();

Code

package org.my.protocols.classpath;

import java.io.IOException;

import java.net.URL;

import java.net.URLConnection;

import java.net.URLStreamHandler;

/** A {@link URLStreamHandler} that handles resources on the classpath. */

public class Handler extends URLStreamHandler {

/** The classloader to find resources from. */

private final ClassLoader classLoader;

public Handler() {

this.classLoader = getClass().getClassLoader();

}

public Handler(ClassLoader classLoader) {

this.classLoader = classLoader;

}

@Override

protected URLConnection openConnection(URL u) throws IOException {

final URL resourceUrl = classLoader.getResource(u.getPath());

return resourceUrl.openConnection();

}

}

启动问题

如果你像我一样,就不想依靠启动中设置的属性来将你带到某个地方(就我而言,我想像Java WebStart一样保持打开选项-这就是为什么我需要所有这些内容)。

解决方法/增强功能

手册代码处理程序规范

如果你控制代码,则可以

new URL(null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()))

这将使用你的处理程序打开连接。

但这又不尽如人意,因为你不需要URL即可执行此操作-你之所以要这样做是因为你无法(或不想控制)某些lib想要url …

JVM处理程序注册

最终的选择是注册一个URLStreamHandlerFactory将处理jvm中所有URL的:

package my.org.url;

import java.net.URLStreamHandler;

import java.net.URLStreamHandlerFactory;

import java.util.HashMap;

import java.util.Map;

class ConfigurableStreamHandlerFactory implements URLStreamHandlerFactory {

private final Map protocolHandlers;

public ConfigurableStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) {

protocolHandlers = new HashMap();

addHandler(protocol, urlHandler);

}

public void addHandler(String protocol, URLStreamHandler urlHandler) {

protocolHandlers.put(protocol, urlHandler);

}

public URLStreamHandler createURLStreamHandler(String protocol) {

return protocolHandlers.get(protocol);

}

}

要注册处理程序,请致电URL.setURLStreamHandlerFactory()你配置的工厂。然后new URL("classpath:org/my/package/resource.extension")像第一个例子一样去做。

JVM处理程序注册问题

请注意,每个JVM只能调用一次此方法,请注意,Tomcat将使用此方法注册JNDI处理程序(AFAIK)。试试Jetty(我会的);最坏的情况是,你可以先使用该方法,然后它必须在你周围解决!

License

我将其发布到公共领域,并询问是否要修改以在某个地方启动OSS项目并在此处提供详细信息。更好的实现是让每个URLStreamHandlerFactory使用ThreadLocal来存储。我什至会给你我的修改和测试课程。URLStreamHandlerThread.currentThread().getContextClassLoader()

2020-03-08

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,动态加载是指在程序运行时动态地加载,而不是在编译时加载。这种方式可以使程序更加灵活,可以根据不同的需求加载不同的Java 的枚举(Enum)也可以通过动态加载的方式来实现。枚举是一种特殊的,可以包含常量、方法和字段。在 Java ,枚举常量是在编译时确定的,但是可以通过动态加载来动态地加载枚举。 下面是一个动态加载枚举的示例代码: ```java import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class DynamicEnumLoader { public static void main(String[] args) throws Exception { // 枚举路径 URL url = new URL("file:/path/to/enum/classes"); // 创建加载URLClassLoader classLoader = new URLClassLoader(new URL[]{url}); // 加载枚举 Class<?> enumClass = classLoader.loadClass("com.example.MyEnum"); // 获取枚举常量 Object[] enumConstants = enumClass.getEnumConstants(); // 调用枚举方法 Method method = enumClass.getMethod("getValue"); for (Object obj : enumConstants) { String value = (String) method.invoke(obj); System.out.println(value); } } } ``` 在上面的示例,我们创建了一个 URLClassLoader 对象,将枚举路径传入其。然后使用该加载加载了 MyEnum 枚举。最后,通过反射的方式调用了 getValue 方法,获取枚举常量的值。 需要注意的是,动态加载的枚举必须要和程序的在同一个加载,否则会出现 ClassCastException 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值