/**
* This class loader loads encrypted class files.
*/
class CryptoClassLoader extends ClassLoader {
/**
* Constructs a crypto class loader.
*
* @param k
* the decryption key
*/
public CryptoClassLoader(int k) {
key = k;
}
protected Class findClass(String name) throws ClassNotFoundException {
byte[] classBytes = null;
try {
classBytes = loadClassBytes(name);
} catch (IOException e) {
throw new ClassNotFoundException(name);
}
Class cl = defineClass(name, classBytes, 0, classBytes.length);
if (cl == null)
throw new ClassNotFoundException(name);
return cl;
}
/**
* Loads and decrypt the class file bytes.
*
* @param name
* the class name
* @return an array with the class file bytes
*/
private byte[] loadClassBytes(String name) throws IOException {
String cname = name.replace('.', '/') + ".caesar";
FileInputStream in = null;
in = new FileInputStream(cname);
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int ch;
while ((ch = in.read()) != -1) {
byte b = (byte) (ch - key);
buffer.write(b);
}
in.close();
return buffer.toByteArray();
} finally {
in.close();
}
}
private int key;
}
看看怎么实现一个自己的ClassLoader(我们以web应用的classloader为例来讲解)
大家都很熟悉tomcat,比如我们要写一个servlet运行的话.
1,我们通常会在tomcat的webapps目录下建一个自己的web目录(比如myweb),然后让自己的myweb至少具有以下目录结构.
└─WEB-INF
├─classes
└─lib
2,直接把class文件拷贝到classes目录下,或者把自己做的servet打成jar放到lib下
3,启动tomcat就能访问servlet了.
再说一点:不少人了解struts,也做过基于struts的应用.其实struts对于我们来说只是几个jar而已,我们要在自己的应用中用 struts,
只不过就象上面一样把struts的各个lib拷贝到web应用的WEB-INF/lib下就OK了.
再综合前面的基础部分,其实web应用是有自己的classloader的,他专门负责加载WEB-INF/lib和WEB-INF /classes的类。下面我们就来模拟一下web应用的classloader,相信看了下面的代码你就会对classloader的理解又上一个台阶.
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/*
* web应用的classloader
* 带你步入classloader的天堂
*/
public class WebAppClassLoader{
URLClassLoader myClassLoader = null;
/*
* 用法:new WebAppClassLoader(webRoot)
* 比如:new WebAppClassLoader("c:/web")
*/
public WebAppClassLoader(String root) {
URL[] urls = null;
try {
urls = getJarURLs(root);
} catch (MalformedURLException e) {
System.out.println(e.getMessage());
}
myClassLoader = new URLClassLoader(urls);
}
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。