如何使用加载的类扩展Java类?

时间:2011-08-03 14:07:04

标签: java

我正在注入Applet,因为它无法检查它是哪个网站 目的是将一个未经修改的外部applet加载到我的中,这样我就可以将它嵌入到我的中。

    final URL[] appletURL = { new URL(Main.getBase() + "/loader.jar") };
    final URLClassLoader classLoader = new URLClassLoader(appletURL); // gets the class
    final Class<?> loader = classLoader.loadClass("loader"); // loads the class
    applet = (Applet) loader.newInstance(); // creates the applet
    applet.setStub(new Injector()); // injects the getdocumentbase, so it thinks he is on his own website
    applet.init(); // start applet
    applet.start();
    applet.setPreferredSize(new Dimension(800, 600)); // to be able to add to jframe properly

“applet.setStub(new Injector());”部分是为了防止导航或不加载,因为它不是applet自己的网站 但现在我想将外部小程序渲染为屏幕截图。 我试过这个:

@Override
public void actionPerformed(final ActionEvent e) {
    final String s = e.getActionCommand();
    if (s.equals("Screenshot")) {
        final BufferedImage offScreen = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
        applet.update(offScreen.createGraphics());
        try {
            ImageIO.write(offScreen, "PNG", new File("C:/Users/Mitchell/Pictures/screenshot.png"));
        } catch (Exception ex) {  }
    }
}

但它不使用paint或updat方法。 它使用了getGraphics(),我倾向于扩展我想要截图的applet。 但applet是动态加载的,那么如何使用加载的类(或applet)扩展类?

有人可以提供代码示例吗? 我即将惊慌失措,因为这花费了我所有的时间,没有这个我就无法继续。

2 个答案:

答案 0 :(得分:2)

看看cglib

如果要扩展类而不是要扩展的类,您需要实现一个接口,请查看java.lang.reflect.Proxy

答案 1 :(得分:1)

如果你只是动态地添加一个字段,那么就不会有任何使用它的代码,这是毫无意义的(除了通过反射访问)

如果你想要一个具有动态字段名称的对象,那么Map<String, Object>就是你真正想要的。


您可以扩展一个具有其他字段的类,如果它不是最终的,则可以采用多种方式。

您可以在编译时执行此操作,您可以在运行时编译代码,您可以在运行时从生成的字节代码中添加一个类。

如果您知道需要扩展类,请编写代码来执行此操作,而不需要生成任何内容。