从其类名添加游戏到applet

时间:2012-08-03 01:07:34

标签: java security reflection applet initialization

我想创建一个applet,以便它可以用来显示扩展JPanel的游戏。该课程将成为图书馆的一部分。所以我不知道班级的名字。我不得不动态加载它。这是我目前的实施。

package com.gej.core;

import javax.swing.JApplet;
import javax.swing.JOptionPane;

/**
 * Runs a game as an Applet by loading the class dynamically at runtime. The
 * name of the class should be specified as a parameter named game-class.
 * 
 * @author Sri Harsha Chilakapati
 */
public class GApplet extends JApplet {

    private static final long serialVersionUID = 1994280929713148311L;

    String gmname = "";

    public GApplet(String gmname) {
        this.gmname = gmname;
    }

    public GApplet() {
        gmname = "";
    }

    public void init(){
        if (gmname == null || gmname == "") {
            gmname = JOptionPane.showInputDialog("Enter game class name");
        }
        try {
            Class<?> gameClass = getClass().getClassLoader().loadClass(gmname);
            add((Game) gameClass.newInstance());
        } catch (ClassNotFoundException e) {
            System.err.println("Error finding class : " + gmname);
        } catch (InstantiationException e) {
            System.err.println("Error loading class : " + gmname);
        } catch (IllegalAccessException e) {
            System.err.println("Error loading class : " + gmname);
        }
    }
}

我遇到的问题是,这在Applet Viewer中效果很好,但在任何其他浏览器中都不起作用(在Firefox,Opera,Epiphany,Internet Explorer,Chrome上测试过)。错误是Applet not initialized

控制台输出

java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)
/build/buildd/icedtea-web-1.1.3/build/../plugin/icedteanp/IcedTeaNPPlugin.cc:631: thread
0xb75368e0: Error: Unknown plugin value requested.
/build/buildd/icedtea-web-1.1.3/build/../plugin/icedteanp/IcedTeaNPPlugin.cc:631: thread 
0xb75368e0: Error: Unknown plugin value requested.
java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:131)
at java.util.jar.JarFile.<init>(JarFile.java:150)
at java.util.jar.JarFile.<init>(JarFile.java:101)
at net.sourceforge.jnlp.tools.JarSigner.verifyJar(JarSigner.java:241)
at net.sourceforge.jnlp.tools.JarSigner.verifyJars(JarSigner.java:201)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1145)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1143)
at java.security.AccessController.doPrivileged(Native Method)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.addNewJar(JNLPClassLoader.java:1143)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1043)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
java.security.PrivilegedActionException: java.util.zip.ZipException: error in opening zip file
at java.security.AccessController.doPrivileged(Native Method)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.addNewJar(JNLPClassLoader.java:1143)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1043)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
Caused by: java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:131)
at java.util.jar.JarFile.<init>(JarFile.java:150)
at java.util.jar.JarFile.<init>(JarFile.java:101)
at net.sourceforge.jnlp.tools.JarSigner.verifyJar(JarSigner.java:241)
at net.sourceforge.jnlp.tools.JarSigner.verifyJars(JarSigner.java:201)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1145)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1143)
... 6 more
net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize applet.
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:728)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
Caused by: java.lang.ClassNotFoundException: com.gej.GApplet
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1089)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
... 2 more
Caused by: 
java.lang.ClassNotFoundException: com.gej.GApplet
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1089)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
java.lang.NullPointerException
at net.sourceforge.jnlp.NetxPanel.runLoader(NetxPanel.java:109)
at sun.applet.AppletPanel.run(AppletPanel.java:380)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)
java.lang.NullPointerException
at sun.applet.AppletPanel.run(AppletPanel.java:430)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)

更新

我设法通过更新插件来摆脱它。这是新的日志。

java.security.AccessControlException: access denied (java.util.PropertyPermission sun.java2d.opengl write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
at java.security.AccessController.checkPermission(AccessController.java:553)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at net.sourceforge.jnlp.runtime.JNLPSecurityManager.checkPermission(JNLPSecurityManager.java:284)
at java.lang.System.setProperty(System.java:744)
at com.gej.core.Game.init(Game.java:83)
at com.gej.core.Game.<init>(Game.java:69)
at com.breakout.Breakout.<init>(Breakout.java:55)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at com.gej.core.GApplet.init(GApplet.java:38)
at sun.applet.AppletPanel.run(AppletPanel.java:436)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)

解决

这是我改变了它并解决了

try {
    System.setProperty("sun.java2d.opengl", "true");
} catch (Exception e) {
    // System doesn't support opengl
}

我修改了代码,以便它只在窗口或全屏模式下设置属性

1 个答案:

答案 0 :(得分:2)

java.security.AccessControlException: access denied 
    (java.util.PropertyPermission sun.java2d.opengl write)

只有受信任的applet才能设置该属性。对代码进行数字签名。