2016-01-22 32 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");