我有一个类,它在静态初始化器中加载和解析XML文件中的数据,如下所示:
class A {
//static structures to store parsed XML data
public static int num;
...
static {
try {
//load/parse XML data
catch (Exception e) {
throw new RuntimeException("...");
}
}
pu
例如,当我定义静态或常量成员时:
public static final Font BIG_FONT = new Font("", Font.BOLD, 18);
我注意到,它们只在我第一次使用它们时加载,这要么导致运行时结冰,要么迫使我在程序启动时强制“使用”常量预加载它们。
不是应该在程序启动时加载这种类型的静态成员,而不是等待第一次使用时加载吗?如何确保它们是预加载的?
提前谢谢。
这是我的代码:
public class StupidClass {
static {
System.out.println("Stupid class loaded!");
}
}
以及我所做的测试,我分别运行和。
import org.junit.Test;
public class StupidTest {
@Test
public void foo() throws ClassNotFoundException {
final Class<?> stupidClass = Class.forN
好吧,我有这样一个密码:
public class Main {
public static void main(String[] args) {
Test t; //1
Integer i = new Integer(1); //2
t = new Test(); //3
System.out.println(Test4.a); //4
}
}
class Test {
private int a = 10;
private Test2 t2; //5
List<Test2>
假设static class MyClass类型在期间加载失败。可能这个类包含一个静态属性,它从配置中读取连接字符串。对所述DLL中类型的进一步引用会导致AppDomain.AssemblyLoad尝试重新加载DLL吗?
换句话说,AppDomain.AssemblyLoad是否会重试以前未能加载的DLL?
创建对类的对象的引用是否会导致类被加载?
静态变量是在类加载时初始化的,所以考虑到下面的代码,答案是否定的,对吗?
class A{
static int f(){
System.out.println("initializing!");
return 0;
}
static final int i = f();
}
public class Main {
public static void main(String[] args) {
看来,我缺少了锁定类的重要概念,而且根据我在java中的知识,它是相关的类加载event.As,只有当类加载器已经在内存中加载类(字节代码)时,我们才能使用任何类。基于这个假设,我认为“当语句同步( SharedQ ){.}在下面的代码中执行时,应该执行SharedQ类的静态块”。但这不一样。有人能解释一下这里到底发生了什么吗。
public class VerifyClassLoadingOnClassLock {
public static void main(String[] args) {
show();
}
private static vo
理解如何加载类和调用静态初始化程序
所以,我只是想确认一下-
public class OOMErrorB extends OOMErrorA {
public static int c = 10;
static {
System.out.println("Loading static B " + c);
System.out.println(OOMErrorA.a);
}
public static void main(String[] args) {
new OOMErrorB();
让我们假设下面的类定义:
public class A {
public final static String SOME_VALUE;
static {
SOME_VALUE = "some.value";
}
}
public class B {
private final String value = A.SOME_VALUE;
}
假设类A还没有被加载,那么当类B的对象被某个线程T实例化时会发生什么呢?必须首先加载和实例化类A。但我的问题是:如果它是在线程T的上下文中完成的,或者更确切地说,是在其他(特殊的)“类加载器
默认情况下,Sun的JVM既延迟加载类,又延迟初始化它们(即调用它们的<clinit>方法)。考虑下面的类ClinitBomb,它在static{}块期间抛出一个Exception。
public class ClinitBomb {
static {
explode();
}
private static void explode() {
throw new RuntimeException("boom!");
}
}
现在,考虑一下如何触发炸弹:
public class Mai
我正在使用一个初始化程序,它在应用程序上做一些猴子补丁,首先将一些应用程序关注点包含到第三方库中。基本上:
# config/initializers/my_initializer.rb
class SomeExternalLib
include MyConcern1
include MyConcern2
end
这在Rails 5.2.3中很好,但是在升级到Rails 6时,我得到了下面的弃用消息:
弃用警告:初始化自动加载常量MyConcern1和MyConcern2。
能够做到这一点是不可取的。在Rails的未来版本中,初始化期间的自动加载将是一个错误条件。
重新加载不会重新
public class Test{
static Test test = new Test();
static {
System.out.println("Test class ...");
}
public static void main(String[] args){
}
}
请参阅上面的代码,类Test将在调用main时加载,并将构造名为test的静态实例,在调用static Test test = new Test();时是否已经加载了Test类?如果没有,这样做安全吗?如果已加载,那么在类已加载但未初始化时
我只想知道在构造函数内加载数据和在构造函数外加载数据,而不是在任何方法内加载数据。
示例:在构造函数内部加载
public class Model{
Object testobject;
public Model(){
testobject=new Object();
}
}
VS
示例:加载外部构造函数
public class Model{
Object testobject=new Object();
public Model(){
}
}