最近遇到了一些让我思考的代码.有什么区别:
Class theClass = Class.forName("SomeImpl");
SomeImpl impl = (SomeImpl)theClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
和:
Class theClass = ClassLoader.loadClass("SomeImpl");
SomeImpl impl = (SomeImpl)theClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
他们是同义词吗?在某些情况下,是否优先于另一方?使用这两种方法有什么用,有什么用呢?
提前致谢.
以下是2个代码段
第一个使用ClassLoader类来加载指定的类
ClassLoader cls = ClassLoader.getSystemClassLoader();
Class someClass = cls.loadClass("TargetClass");
第二个使用Class.forName()来加载指定的类
Class cls = Class.forName("TargetClass");
上述方法之间有什么区别.哪一个用于哪个目的?
到目前为止,我看到的自定义ClassLoader示例涉及子类化URLClassLoader,并使用该特定实例加载资源中的类.
我徒劳地试图寻找替换SystemClassLoader的替代方法,以便可以为不在类路径中的类查询我的ClassLoader.
我试过了Thread.currentThread().setContextClassLoader,但似乎没有用.
它甚至可能吗?
我遇到了这个有用的链接,代码在更新时可以很好地运行,可以点击我的网络服务器.我绝对可以做到一切.
现在,我唯一不完全理解的是Class.forName().
为什么要使用它?可以这样做吗?这是一个解决其他问题的工作吗?添加参考?创建一个类来实现/扩展另一个类?
我想完全理解发生了什么,但这是我的方式.
谢谢
我有一个解析URL并提取一些数据的库.每个URL有一个类.要知道哪个类应该处理用户提供的URL,我有以下代码.
public class HostExtractorFactory {
private HostExtractorFactory() {
}
public static HostExtractor getHostExtractor(URL url)
throws URLNotSupportedException {
String host = url.getHost();
switch (host) {
case HostExtractorABC.HOST_NAME:
return HostExtractorAbc.getInstance();
case HostExtractorDEF.HOST_NAME:
return HostExtractorDef.getInstance();
case HostExtractorGHI.HOST_NAME:
return HostExtractorGhi.getInstance();
default:
throw new URLNotSupportedException(
"The url provided does not have a corresponding HostExtractor: ["
+ host + "]");
}
}
Run Code Online (Sandbox Code Playgroud)
}
问题是用户要求解析更多的URL,这意味着我的switch语句正在增长.每当有人提出解析器时,我都必须修改我的代码以包含它.
为了结束这个,我决定创建一个地图并将它暴露给它们,这样当他们的类被编写时,他们可以通过向工厂提供主机名和提取器来将自己注册到工厂.以下是实施此想法的工厂.
public class HostExtractorFactory {
private static final Map<String, HostExtractor> EXTRACTOR_MAPPING = new HashMap<>();
private HostExtractorFactory() {
}
public static HostExtractor getHostExtractor(URL …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行此代码:
public class ClassLoaderTest
{
public static void main(String[] args) throws Exception
{
Object[] obj = new Object[]{};
String cname = obj.getClass().getName();
System.out.println(cname);
ClassLoaderTest.class.getClassLoader().loadClass(cname);
}
}
Run Code Online (Sandbox Code Playgroud)
但它会抛出ClassNotFoundException.有趣的是,如果我改为使用这一行:
Class.forName(cname);
Run Code Online (Sandbox Code Playgroud)
它工作得很好.
这里发生了什么?
编辑:我正在使用Java 6. println打印此:
[Ljava.lang.Object;
Run Code Online (Sandbox Code Playgroud)