📄 classloadertest.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 + -