Java 从中向小程序添加游戏';s类名称

Java 从中向小程序添加游戏';s类名称,java,security,reflection,applet,initialization,Java,Security,Reflection,Applet,Initialization,我想制作一个小程序,这样它就可以用来显示一个扩展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 * nam

我想制作一个小程序,这样它就可以用来显示一个扩展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);
        }
    }
}
更新 我已经设法通过更新插件来摆脱这个问题。这是新的日志

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)
我已经修改了代码,这样它将只在窗口或全屏模式下设置属性

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

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

当我刚刚使用
add(new TestGame())添加一个测试游戏时,
也会给出相同的错误更改所有
catch
语句以添加
e.printStackTrace()。打开Java控制台。复制/粘贴输出。我目前正在使用IcedTea java插件,它显示了一个对话框错误并关闭。在java控制台中,它在第19行显示了
SecurityException
我希望反射出现
SecurityException
(在一个不受信任的小程序中),但对于
add(new TestGame())
,它应该工作了,或者显示了一个不同的错误。@AndrewThompson为了提供更多信息,不受信任的ACC无法使用
setAccessible
包中列出的包层次结构。access
安全属性也不可用。所以不受信任的反射不应该允许访问你无论如何都无法链接到的东西。正如前面提到的,我的答案是完全错误的。我在代码中看不到任何可能导致您看到的
SecurityException
。我现在怀疑它可能是使用了
URLClassLoader
,但在您发布显示错误的完整代码之前,我只是猜测。“我当前使用的是IcedTea java插件,它显示了一个对话框错误并关闭了。在java控制台中,它在第19行显示了
SecurityException
”我猜这不是整个堆栈跟踪,请复制/粘贴控制台中的所有内容。将其作为问题的编辑,而不是新注释。添加(new TestGame())
也不起作用。它说对java2d.opengl.pipeline的访问被拒绝
try {
    System.setProperty("sun.java2d.opengl", "true");
} catch (Exception e) {
    // System doesn't support opengl
}
java.security.AccessControlException: access denied 
    (java.util.PropertyPermission sun.java2d.opengl write)