`

Java基础九:Java中的类加载器说明,可以对class文件加密,自定义ClassLoader

阅读更多
/**
 * Java 类加载器
 * 
 * @author 张明学
 * 
 */
public class ClassLoaderStudy {

	public static void main(String[] args) throws Exception {
		// 获取:加载ClassLoaderStudy的类加载器
		System.out.println(ClassLoaderStudy.class.getClassLoader().getClass().getName());// AppClassLoader
		// 获取:加载ClassLoaderStudy所遍历的类加载器
		ClassLoader classLoader = ClassLoaderStudy.class.getClassLoader();
		while (null != classLoader) {
			System.out.println(classLoader.getClass().getName());
			classLoader = classLoader.getParent();
		}
		
		/**
		 * Java 提供了三个类加载器                                                              
		 * BootStrap ------> getParent() == null;负责加载JRE/lib/rt.jar中的class
		 * ExtClassLoader ------> getParent() == BootStrap; 负责加载JRE/lib/ext/*.jar中的class
		 * AppClassLoader ------> getParent() == ExtClassLoader; 负责加载CLASSPATH指定的所有jar目录
		 * 每个一个加载器(除BootStrap外)包括自己定义的类加载器,加载一个class时首先交给它的父加载器,父加载器再交给它的父加载器
		 * 直到BootStrap类加载器,当父加载器没有找到时再交给它的子加载器,一层层的找,若都没有找到就报:java.lang.ClassNotFoundException
		 * 
		 * 当需要加载一个类默认首选使用当前线程的类加载器去加载,若A类中引用了B类则B也是由该加载器去加载
		 */
		
		// 用自己的类加载去加载自己加过密的class文件
		// 必须要把原来目录中的(即:bin\com\mengya\classLoader\)下面的myClass删除,因为
		// 加载myClass时MyClassLoader首先会交给父加载器,若父加载器在原目录中找到了myClass的class文件
		// 那么就是父加载器去加载了,也就轮不到自己定义的MyClassLoader加载了。
		Class clazz = new MyClassLoader().loadClass("com.mengya.classLoader.myClass");
		// 因为自己编写的myClass是加过密的,故编译器不能正确编译myClass文件,即不能出现MyClass。
		// 故让MyClass继承另一个类,用的时候让它的父类(接口等)去引用加过密的myClass实例
		MyClassInter test = (MyClassInter) clazz.newInstance();
		// MyClass myClass = null;编译器报错
		System.out.println(test.toString());
		
	}
}

 

/**
 * 自定义的类加载器(继承ClassLoader重写findClass方法)
 * 
 * @author 张明学
 * 
 */
public class MyClassLoader extends ClassLoader {
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		String destPath = "F:\\MyEclipseWorkspace\\JavaBase\\myClassLib";
		String className = name.substring(name.lastIndexOf('.') + 1);
		String classFileName = destPath + "\\" + className + ".class";
		InputStream fileInStream = null;
		ByteArrayOutputStream byteArrayOutStream = null;
		try {
			fileInStream = new FileInputStream(classFileName);
			byteArrayOutStream = new ByteArrayOutputStream();
			encrypt(fileInStream, byteArrayOutStream);
			byte[] classByte = byteArrayOutStream.toByteArray();
			return defineClass(classByte, 0, classByte.length);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				byteArrayOutStream.close();
				fileInStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return super.findClass(name);
	}

	/**
	 * 用来加密class文件
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 原class文件
		String srcPath = "F:\\MyEclipseWorkspace\\JavaBase\\bin\\com\\mengya\\classLoader\\MyClass.class";
		// 加密class文件存放目录
		String destPath = "F:\\MyEclipseWorkspace\\JavaBase\\myClassLib";
		InputStream fileInStream = null;
		OutputStream fileOutStream = null;
		try {
			fileInStream = new FileInputStream(srcPath);
			String fileName = srcPath.substring(srcPath.lastIndexOf('\\') + 1);
			String destFilePath = destPath + "\\" + fileName;
			fileOutStream = new FileOutputStream(destFilePath);
			encrypt(fileInStream, fileOutStream);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				fileOutStream.close();
				fileInStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 对class文件加(解)密
	 * 
	 * @param inStream
	 *            class文件输入流
	 * @param outStream
	 *            class文件输出流
	 */
	public static void encrypt(InputStream inStream, OutputStream outStream)
			throws Exception {
		int b = -1;
		while ((b = inStream.read()) != -1) {
			outStream.write(b ^ 0xff);
		}
	}
}

 

/**
 * 自己定义的类加载加载的测试类
 * 
 * @author 张明学
 * 
 */
public class MyClass implements MyClassInter {
	@Override
	public String toString() {
		return "Hello !";
	}
}

 

public interface MyClassInter {

}

 

3
0
分享到:
评论
1 楼 mercyblitz 2010-05-31  
不明白,有一个URLClassLoader,为什么要重复发明呢?

相关推荐

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    这样,每次调用代理类中的方法,都会先检查实现类的class文件是否是最新的,如果不是则重新加载,达到动态加载实现类class的目的。 关键字: Java实现热加载; Java动态加载class; Java覆盖已加载的class; Java...

    java class加密保护工具

    本工具是对java class文件进行加密保护的工具!本工具全面支持linux/unix/windows操作系统。 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是...

    Java类加密2.0版本,无限制

    JAVA CLASS文件加密工具对CLASS文件进行加密保护,加密密钥高达256位(bit,即:32字节),并采用多重加密的算法,既安全又高效。加密后的CLASS文件不可能被破解;反编译工具对加密后的CLASS文件无能为力,根本就不...

    java自定义类加载classloader文档,包括代码

    java自定义类加载classloader文档,包括代码,以及详细的原理及过程

    Java类加密程序

    &lt;br&gt;举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下: java -agentlib:c:\hideasoft\java_protect\hidea &lt;您的CLASS类及参数&gt; 应用场合 独立的应用...

    ClassLoader类加载器

    ClassLoader的API使用和自定义

    JAVA ClassLoader 讲解 (类加载器)

    ClassLoader类加载器讲解,理解JAVA类加载机制

    java应用程序类加载器,ClassLoader for java Application

    java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置

    自定义Java类加载器demo

    自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制

    java类加载器实例

    它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 ...

    java class加密保护(完全免费) v2.1

    本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...

    java类加密工具v2.1

    本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...

    掌握Java类加载器

    Java允许使用不同的类加载器,甚至自定义的类加载器。类加载器从源文件(通常是.class 或 .jar文件)获得不依赖平台的字节码,然后将它们加载到JVM内存空间,所以它们能被解释和执行。默认状态下,应用程序的每个类...

    ClassLoader类加载机制

    它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 ...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    自定义classloader的使用

    自定义classloader的使用

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

    自定义类加载器

    简单的自定义类加载器问候世界hello word,基于磁盘的ClassLoader

    Java类加密工具v2.2(免注册)

    本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...

    Java加壳源码-自定义类加载器

    Java加壳核心代码,请调试后使用。本资源配合博客进行讲解,博客地址:http://blog.csdn.net/JavaBuilt/article/details/79522837

Global site tag (gtag.js) - Google Analytics