相关疑难解决方法(0)

Java:Class.forName和ClassLoader.loadClass之间的区别

最近遇到了一些让我思考的代码.有什么区别:

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)

他们是同义词吗?在某些情况下,是否优先于另一方?使用这两种方法有什么用,有什么用呢?

提前致谢.

java classloader

40
推荐指数
2
解决办法
3万
查看次数

使用ClassLoader和Class.forName加载类之间的区别

以下是2个代码段

第一个使用ClassLoader类来加载指定的类

ClassLoader cls = ClassLoader.getSystemClassLoader(); Class someClass = cls.loadClass("TargetClass");

第二个使用Class.forName()来加载指定的类

Class cls = Class.forName("TargetClass");

上述方法之间有什么区别.哪一个用于哪个目的?

java reflection classloader

23
推荐指数
3
解决办法
3万
查看次数

包含Jars的Jars中的类的替换系统类加载器

到目前为止,我看到的自定义ClassLoader示例涉及子类化URLClassLoader,并使用该特定实例加载资源中的类.

我徒劳地试图寻找替换SystemClassLoader的替代方法,以便可以为不在类路径中的类查询我的ClassLoader.

我试过了Thread.currentThread().setContextClassLoader,但似乎没有用.

它甚至可能吗?

java jar classloader

14
推荐指数
2
解决办法
1万
查看次数

更好的理解 - Class.forName("com.mysql.jdbc.Driver").newInstance();

我遇到了这个有用的链接,代码在更新时可以很好地运行,可以点击我的网络服务器.我绝对可以做到一切.

现在,我唯一不完全理解的是Class.forName().

为什么要使用它?可以这样做吗?这是一个解决其他问题的工作吗?添加参考?创建一个类来实现/扩展另一个类?

我想完全理解发生了什么,但这是我的方式.

谢谢

java mysql

7
推荐指数
3
解决办法
2万
查看次数

动态调用工厂中的正确实现

我有一个解析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)

java switch-statement

6
推荐指数
1
解决办法
145
查看次数

使用类加载器加载数组

我正在尝试运行此代码:

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)

java class loader classloader

5
推荐指数
1
解决办法
770
查看次数

标签 统计

java ×6

classloader ×4

class ×1

jar ×1

loader ×1

mysql ×1

reflection ×1

switch-statement ×1