⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classloadertest.java

📁 sun公司开发的,java2核心技术,卷II:高级性能,包括一系列的高级java应用技术,如数据库德连接,高级swing,多线程,软件本地化等等,本文件中则包含该书中的所用实例,配合该书使用,使对ja
💻 JAVA
字号:
/**
 * @version 1.10 1999-10-04
 * @author Cay Horstmann
 */

import java.util.*;
import java.io.*;
import java.lang.reflect.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ClassLoaderTest
{  public static void main(String[] args)
   {  Frame f = new ClassLoaderFrame();
      f.show();
   }
}

class ClassLoaderFrame extends JFrame
{  public ClassLoaderFrame()
   {  setTitle("ClassLoaderTest");
      setSize(300, 200);
      addWindowListener(new WindowAdapter()
         {  public void windowClosing(WindowEvent e)
            {  System.exit(0);
            }
         } );
      getContentPane().setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.weightx = 0;
      gbc.weighty = 100;
      gbc.fill = GridBagConstraints.NONE;
      gbc.anchor = GridBagConstraints.EAST;
      add(new JLabel("Class"), gbc, 0, 0, 1, 1);
      add(new JLabel("Key"), gbc, 0, 1, 1, 1);
      gbc.weightx = 100;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.anchor = GridBagConstraints.WEST;
      add(nameField, gbc, 1, 0, 1, 1);
      add(keyField, gbc, 1, 1, 1, 1);
      gbc.fill = GridBagConstraints.NONE;
      gbc.anchor = GridBagConstraints.CENTER;
      JButton loadButton = new JButton("Load");
      add(loadButton, gbc, 0, 2, 2, 1);
      loadButton.addActionListener(
         new ActionListener()
         {  public void actionPerformed(ActionEvent event)
            {  runClass(nameField.getText(), keyField.getText());
            }
         });
   }

   public void add(Component c, GridBagConstraints gbc,
      int x, int y, int w, int h)
   {  gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = w;
      gbc.gridheight = h;
      getContentPane().add(c, gbc);
   }

   public void runClass(String name, String key)
   {  try
      {  ClassLoader loader
            = new CryptoClassLoader(Integer.parseInt(key));
         Class c = loader.loadClass(name);
         String[] args = new String[] {};

         Method m = c.getMethod("main",
            new Class[] { args.getClass() });
         m.invoke(null, new Object[] { args });
      }
      catch (Throwable e)
      {  JOptionPane.showMessageDialog(this, e);
      }
   }

   private JTextField keyField = new JTextField("3", 4);
   private JTextField nameField = new JTextField(30);
}

class CryptoClassLoader extends ClassLoader
{  public CryptoClassLoader(int k)
   {  key = k;
   }

   protected synchronized Class loadClass(String name,
      boolean resolve) throws ClassNotFoundException
   {  // check if class already loaded
      Class cl = (Class)classes.get(name);

      if (cl == null) // new class
      {  try
         {  // check if system class
            return findSystemClass(name);
         }
         catch (ClassNotFoundException e) {}
         catch (NoClassDefFoundError e) {}

         // load class bytes--details depend on class loader

         byte[] classBytes = loadClassBytes(name);
         if (classBytes == null)
            throw new ClassNotFoundException(name);

         cl = defineClass(name, classBytes,
            0, classBytes.length);
         if (cl == null)
            throw new ClassNotFoundException(name);

         classes.put(name, cl); // remember class
      }

      if (resolve) resolveClass(cl);

      return cl;
   }

   private byte[] loadClassBytes(String name)
   {  String cname = name.replace('.', '/') + ".caesar";
      FileInputStream in = null;
      try
      {  in = new FileInputStream(cname);
         ByteArrayOutputStream buffer
            = new ByteArrayOutputStream();
         int ch;
         while ((ch = in.read()) != -1)
         {  byte b = (byte)(ch - key);
            buffer.write(b);
         }
         in.close();
         return buffer.toByteArray();
      }
      catch (IOException e)
      {  if (in != null)
         {  try { in.close(); } catch (IOException e2) { }
         }
         return null;
      }
   }

   private Map classes = new HashMap();
   private int key;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -