2

我在这里使用我的 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);

谢谢阅读。

4

2 回答 2

3

类加载器何时加载 Dots 类。它将在此类的第一个引用上加载。看看你有没有参考过这门课

您甚至可以动态加载类 并找到一个类的所有子类型并加载它们,您可以使用这个库

 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();
      }
   }

}
于 2016-01-22T10:22:07.310 回答
2

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

public class SomeClass {

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

    static void someMethod() {
        System.out.println("some static method");
    }
}

  1. 通过创建对象来加载它:

SomeClass foo = new SomeClass();

  1. 通过调用静态方法加载它:

SomeClass.someMethod();

  1. 直接加载:

Class.forName("SomeClass");

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

于 2016-01-22T10:23:27.363 回答