我正在注入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)扩展类?
有人可以提供代码示例吗? 我即将惊慌失措,因为这花费了我所有的时间,没有这个我就无法继续。
答案 0 :(得分:2)
看看cglib。
如果要扩展类而不是要扩展的类,您需要实现一个接口,请查看java.lang.reflect.Proxy
。
答案 1 :(得分:1)
如果你只是动态地添加一个字段,那么就不会有任何使用它的代码,这是毫无意义的(除了通过反射访问)
如果你想要一个具有动态字段名称的对象,那么Map<String, Object>
就是你真正想要的。
您可以扩展一个具有其他字段的类,如果它不是最终的,则可以采用多种方式。
您可以在编译时执行此操作,您可以在运行时编译代码,您可以在运行时从生成的字节代码中添加一个类。
如果您知道需要扩展类,请编写代码来执行此操作,而不需要生成任何内容。