黑马程序员技术交流社区
标题:
类加载器及加密问题
[打印本页]
作者:
lichao
时间:
2013-11-22 11:22
标题:
类加载器及加密问题
import java.util.Date;
public class ClassLoaderTest {
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
Class clazz=new MyClassLoader("xiaodai").loadClass("ClassLoaderDai");//问题为什么这里不调用findClass()函数呢?而调用
Date date=(Date)clazz.newInstance(); //
loaderClass ()方法呢?调用父类的
loaderClass 方法
如
System.out.println(date); //何将”ClassLoaderDai“传给子类的呢?子类有如何用的
} //呢?
}
复制代码
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MyClassLoader extends ClassLoader{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String readFile=args[0];
String writefiles=args[1];
String file=readFile.substring(readFile.lastIndexOf("\\")+1);
String writefile=writefiles+"\\"+file;
InputStream is=new FileInputStream(readFile);
OutputStream os=new FileOutputStream(writefile);
cyper(is,os);
is.close();
os.close();
}
public static void cyper(InputStream is,OutputStream os) throws IOException{
int ips=-1;
while((ips=is.read())!=-1){
os.write(ips^0xff);
}
}
@Override
protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
String readFile=classpaty+"\\"+name+".class";
try {
InputStream is=new FileInputStream(readFile);
ByteArrayOutputStream os=new ByteArrayOutputStream();
cyper(is,os);
is.close();
byte[] b=os.toByteArray();
return defineClass(b, 0, b.length);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private String classpaty;
MyClassLoader(){
}
MyClassLoader(String classpaty){
this.classpaty=classpaty;
}
}
复制代码
import java.util.Date;
public class ClassLoaderDai extends Date {
public String toString(){
return "hello java";
}
}
复制代码
作者:
ysunday
时间:
2013-11-22 21:37
这是个模板设计模式,就是说loadClass()里边的代码是固定的了,流程已经规定好了,但是只有findClass()这个方法呢,对不同的子类有不同的处理方式,其余的loadClass都是一样的,所以如果是自己定义的子类呢,需要写一下,如果在规定的流程内,没找到你要加载的类,就会调用findClass.是内部调用的,当然你可以手动调用,但是很麻烦。
”ClassLoaderDai“这个你不是调用了吗?这里Class clazz=new MyClassLoader("xiaodai").loadClass("ClassLoaderDai");
父类没有找到你要加载的类,就会调用findClass呗,然后你看这里
57行
MyClassLoader(String classpaty){
this.classpaty=classpaty;
}
把 “xiaodai”路径传进去。
然后这里
protected java.lang.Class<?> findClass(String name) throws ClassNotFoundException {
String readFile=classpaty+"\\"+name+".class";
你不是也把类名ClassLoaderDai通过loadClass()--->传给findClass()这个函数了吗
之后的代码自己看下把。
其实我也没怎么看懂这块,这都是我猜的。仅供参考
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2