静态块未运行,没有最终变量

时间:2016-01-22 10:11:21

标签: java static-block

我在这里使用我的API代码:

package org.midnightas.os.game.dots;

import java.awt.Graphics2D;

import org.midnightas.os2.Key;
import org.midnightas.os2.MidnightasOS;
import org.midnightas.os2.gameapi.Game;

public class Dots extends Game {

    public Dots(MidnightasOS midnightasos) {
        super(midnightasos);
    }

    @Override
    public void init() {

    }

    @Override
    public void keyPressed(Key arg0) {

    }

    @Override
    public void render(Graphics2D arg0) {

    }

    @Override
    public void tick() {

    }

    static {
        System.out.println("MOS Dots crashed.");
        MidnightasOS.setGame(Dots.class);
    }

}

静态块应该运行调用MidnightasOS.setGame(Class); 然而,这种情况并没有发生 我也使用System.out调试无济于事 MidnightasOS中存在问题吗?如有必要,我会发布它的代码。

我这样做是因为我正在尝试使用Linux和Raspberry PI创建一个仿真操作系统。
这应该是像Game Boy一样的游戏机 我正在尝试加载所有Game类,因此至少其中一个会使用MidnightasOS.setGame(Class);

感谢阅读。

2 个答案:

答案 0 :(得分:3)

类加载器何时加载Dots类。它将加载到此类的第一个引用。看看你是否参考过这个课程

You can even dynamically load the class 要查找类的所有子类型并加载它们,您可以使用this library

 public class MainClass {

  public static void main(String[] args){

    ClassLoader classLoader = MainClass.class.getClassLoader();

    Reflections reflections = new Reflections("org.midnightas");

    Set<Class<? extends Game>> subTypes = reflections.getSubTypesOf(Game.class);
    for(Class<? extends Game> subType : subTypes){
       try {
          Class aClass = classLoader.loadClass(subType);
          System.out.println("subType.getName() = " + subType.getName());
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
   }

}

答案 1 :(得分:2)

类加载器第一次加载类时,就会执行类中的静态块。实现这一目标有几种可能性。考虑以下课程:

public class SomeClass {

    static {
        System.out.println("static block in SomeClass");
    }

    static void someMethod() {
        System.out.println("some static method");
    }
}
  1. 通过创建对象来加载它:
  2. SomeClass foo = new SomeClass();

    1. 通过调用静态方法加载它:
    2. SomeClass.someMethod();

      1. 直接加载:
      2. Class.forName("SomeClass");

        这些只是你拥有的一些可能性!请注意,您必须将包结构包含在第三种方法中(如果该类在包中,则包含在内。包装将是:Class.forName("some.package.SomeClass");