java:Class.Load?

java:Class.Load?,java,class,load,Java,Class,Load,我对java中的类.forName感到相当困惑。我们如何从C#的角度解释Class.forName是什么 用例:java.lang.Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)Class.forName返回类对象的实例。类相当于c#Class对象 如果尚未加载类,则Class.forName会强制加载这些类。作为类加载过程的一部分,调用类中定义的任何静态块。静态块看起来像 class Foo { static { Syste

我对java中的类.forName感到相当困惑。我们如何从C#的角度解释Class.forName是什么


用例:java.lang.Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)

Class.forName返回类对象的实例。类相当于c#Class对象

如果尚未加载类,则Class.forName会强制加载这些类。作为类加载过程的一部分,调用类中定义的任何静态块。静态块看起来像

class Foo {
    static {
         System.out.println("loaded Foo");
    }
}

//running this will print "loaded Foo"
Class.forName("Foo");
静态块只在第一次加载类时调用一次,因此重复调用class.forName(“Foo”)只会导致打印一次“loaded Foo”。如果尚未加载该类,则创建一个新的Foo实例也会导致该类被加载


通常,JDBC驱动程序会通过调用静态块来注册自己,这就是调用Class.forName()加载驱动程序的原因。

Class.forName返回类对象的实例。类相当于c#Class对象

如果尚未加载类,则Class.forName会强制加载这些类。作为类加载过程的一部分,调用类中定义的任何静态块。静态块看起来像

class Foo {
    static {
         System.out.println("loaded Foo");
    }
}

//running this will print "loaded Foo"
Class.forName("Foo");
静态块只在第一次加载类时调用一次,因此重复调用class.forName(“Foo”)只会导致打印一次“loaded Foo”。如果尚未加载该类,则创建一个新的Foo实例也会导致该类被加载


通常,JDBC驱动程序将通过在静态块中调用来注册自己,这就是调用Class.forName()加载驱动程序的原因。

当您想通过简单地将对象名称作为字符串在java中实例化对象时,可以使用java.lang.Class.forName

它类似于在c#中使用Activator.CreateInstance(objectType)


要了解更多信息,请阅读,当您想通过简单地将对象名称作为字符串来实例化java中的对象时,可以使用java.lang.Class.forName

它类似于在c#中使用Activator.CreateInstance(objectType)


要了解更多信息,请阅读和

你是指java.lang.Class.forName(…)@sbridges是sry我已经更新了它吗?你是指java.lang.Class.forName(…)@sbridges是sry我已经在c中更新了它?当“创建了类的第一个实例或调用了任何静态成员”时,可以自动调用静态构造函数。我们也可以用java实现这一点吗?(类似于隐式调用Class.forName)每当第一次加载类时,就会调用静态块。创建Foo实例还将导致调用静态块。编辑了我的答案以便更清楚地了解这一点。嘿,谢谢你的帮助。顺便说一句,Class.forName是线程安全的吗?(如中所示,它是否能确保静态块中的代码最多只运行一次?)在c中,当“创建类的第一个实例或调用任何静态成员”时,可以自动调用静态构造函数。我们也可以用java实现这一点吗?(类似于隐式调用Class.forName)每当第一次加载类时,就会调用静态块。创建Foo实例还将导致调用静态块。编辑了我的答案以便更清楚地了解这一点。嘿,谢谢你的帮助。顺便说一句,Class.forName是线程安全的吗?(如中所示,它是否能确保静态块中的代码最多只运行一次?)除了Class.forName没有实例化类的对象。是的,谢谢你的澄清。除了Class.forName没有实例化类的对象。是的,谢谢你的澄清。