Java--对于 class文件进行加密 然后通过我们自己写的类加载器进行加载指定类
2012-03-06 15:35
585 查看
2个类 A B ,如果A用到了B 那么就由A的那个类加载器来加载B
我们知道在java中所有的类都是通过类加载器来加载的 , 那么我们当然也可以自己写我们的类加载器 来家在我们指定的类 。
所有的 类加载器都要继承自ClassLoader这个类 , 并且覆盖findClass ,这个ClassLoader类 的loadClass会调用findClass方法来查找指定类 。
我们知道类加载器的加载原理是 自上而下 的树形 ,也就是先用 BootStrap ----> ExtClassLoader--->AppClassLoader---->如果这三个加载器都找不到的话 那么才会调用我们自己写的类加载器加载 class文件 。
对于Eclipse的相对目录是相对于Eclipse中的工程 ,绝对路径是指 class文件在磁盘上的完整存储路径
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
public class MyClassLoader extends ClassLoader
{
public static void main(String[] args) throws Exception
{
// Temp t=new Temp() ;
// FileInputStream fis=new FileInputStream("E:\\workspace\\TestNew\\bin\\Temp.class") ;
// FileOutputStream fos=new FileOutputStream("lib\\Temp.class") ;
// encript(fis,fos);
Class cls=new MyClassLoader("lib").loadClass("Temp") ;
Date dt=(Date)cls.newInstance() ;
System.out.println(dt.toString());
}
public static void encript(InputStream in,OutputStream out) throws Exception
{
int b=-1 ;
while((b=in.read())!=-1)
{
out.write(b^0xff) ;
}
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
String filePath=this.classDir+"\\"+name+".class" ;
try {
FileInputStream fis=new FileInputStream(filePath) ;
ByteArrayOutputStream bos=new ByteArrayOutputStream() ;
encript(fis,bos);
byte []bt=bos.toByteArray() ;
System.out.println("Load ing");
return defineClass(bt,0,bt.length) ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private String classDir;
public MyClassLoader(String classDir)
{
this.classDir=classDir ;
}
}
我们知道在java中所有的类都是通过类加载器来加载的 , 那么我们当然也可以自己写我们的类加载器 来家在我们指定的类 。
所有的 类加载器都要继承自ClassLoader这个类 , 并且覆盖findClass ,这个ClassLoader类 的loadClass会调用findClass方法来查找指定类 。
我们知道类加载器的加载原理是 自上而下 的树形 ,也就是先用 BootStrap ----> ExtClassLoader--->AppClassLoader---->如果这三个加载器都找不到的话 那么才会调用我们自己写的类加载器加载 class文件 。
对于Eclipse的相对目录是相对于Eclipse中的工程 ,绝对路径是指 class文件在磁盘上的完整存储路径
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
public class MyClassLoader extends ClassLoader
{
public static void main(String[] args) throws Exception
{
// Temp t=new Temp() ;
// FileInputStream fis=new FileInputStream("E:\\workspace\\TestNew\\bin\\Temp.class") ;
// FileOutputStream fos=new FileOutputStream("lib\\Temp.class") ;
// encript(fis,fos);
Class cls=new MyClassLoader("lib").loadClass("Temp") ;
Date dt=(Date)cls.newInstance() ;
System.out.println(dt.toString());
}
public static void encript(InputStream in,OutputStream out) throws Exception
{
int b=-1 ;
while((b=in.read())!=-1)
{
out.write(b^0xff) ;
}
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
String filePath=this.classDir+"\\"+name+".class" ;
try {
FileInputStream fis=new FileInputStream(filePath) ;
ByteArrayOutputStream bos=new ByteArrayOutputStream() ;
encript(fis,bos);
byte []bt=bos.toByteArray() ;
System.out.println("Load ing");
return defineClass(bt,0,bt.length) ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private String classDir;
public MyClassLoader(String classDir)
{
this.classDir=classDir ;
}
}
相关文章推荐
- Java--对于 class文件进行加密 然后通过我们自己写的类加载器进行加载指定类
- 通过encryption.exe对java的class文件进行加密
- 【自己动手写类加载器1】实现加密功能:生成加密class文件,复制到bin目录下,AppClassLoader加载出错
- java 高新技术【10】 编写对class文件进行加密的工具类
- 【自己动手写类加载器2】覆盖findClass(String name)方法,删除bin目录下的加密的class文件
- Java通过流对MP4视频文件进行加密,H5 video播放流
- JAVA中使用RSA通过秘钥文件对字符串进行加密解密
- java 高新技术【10】 编写对class文件进行加密的工具类
- java能够进行编译但无法执行.class文件,会提醒无法加载主类
- java自定义ClassLoader加载指定的class文件
- 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作
- 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作
- cmd 指定目录加载lib 来编译 java文件
- Java加载Class文件的原理机制
- 使用java命令运行class文件提示“错误:找不到或无法加载主类“
- 使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
- Java使用URLClassLoader加载指定位置的类
- java文件下载通过response流实现文件存储在客户端指定路径
- swing中通过.class文件(把.java都删除)打包成jar文件,使用皮肤包遇到的问题。
- java 文件加密 用的是md5值进行文件加密