【问题标题】:Static Block not running, no final variables静态块未运行,没有最终变量
【发布时间】:2016-04-28 21:31:54
【问题描述】:

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

感谢阅读。

【问题讨论】:

  • 类加载器第一次加载Dots类后,静态块就会被执行。如果您从中调用任何引用(调用某些方法,创建对象等),它将仅加载该类。
  • setGame 是 MidnightasOS 中的静态方法吗?
  • 您能补充一下您是如何尝试加载 Dots 类的吗?
  • 动态地,我将尝试使用 @awesome 向我展示的库。

标签: java static-block


【解决方案1】:

类加载器何时加载 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();
      }
   }

}

【讨论】:

  • 那我如何加载所有扩展Game的类?所有这些都必须是动态的。
  • 我不能使用反射吗? (我见过有人这样做过。)
  • 你可以使用这个库来查找所有的子类型。github.com/ronmamo/reflections 但我认为你错误地解决了你的问题。可能会在您的问题中添加有关您为什么要这样做的详细信息。为什么要使用静态块。可能有人会给你一个更好的模式来使用
【解决方案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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2012-03-05
    • 2012-11-26
    相关资源
    最近更新 更多