2016-01-22 82 views
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(類); 但是,這沒有發生。
我也調試過使用System.out無濟於事。
MidnightasOS內部存在問題嗎?如果有必要,我會發布它的代碼。

我這樣做是因爲我試圖用Linux和Raspberry PI創建一個人工操作系統。
這應該是像Game Boy這樣的遊戲機。
我試圖加載所有遊戲類,所以至少其中一個會使用MidnightasOS.setGame(Class);

感謝您的閱讀。

+1

只要類加載器第一次加載就會執行該靜態塊Dots'類,如果你調用它的任何引用(調用某種方法,創建一個對象等),它將只加載該類。 – ParkerHalo

+0

已設置在MidnightasOS中設置一個靜態方法? – Stultuske

+0

@Stultuske它是。 – Midnightas

回答

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

} 
+0

然後我如何加載擴展遊戲的所有類? 所有這些都必須是動態的 – Midnightas

+0

這將是太動態http:// stackoverflow。com/questions/492184 /如何找到java中的給定類的所有子類 – awsome

+0

我不能使用Reflections? (我見過有人這樣做過。) – Midnightas

2

靜態塊被儘快執行的classloader是第一次加載類。有幾種可能性來實現這一點。考慮下面的類:

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

  • 加載它通過調用一個靜態方法:
  • SomeClass.someMethod();

    直接
  • 加載它:
  • Class.forName("SomeClass");

    這些只是一些可能性,你有!請注意,必須將包結構包含到第三種方法中(如果該類位於包的某個包中,它將是:Class.forName("some.package.SomeClass");