`

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 类加载器加密是一种增强程序安全性的技术,通过自定义类加载器和解密逻辑,可以在加载类之前对其进行加密,提高代码的保护性。同时,结合反射机制,即使类是加密状态,也能正常执行程序。这种技术常...

    自定义classloader的使用

    Java的类加载机制遵循双亲委派模型,即当一个类加载器需要加载类时,它首先委托父类加载器尝试加载,只有当父类加载器无法加载时,才会尝试自己加载。这种设计避免了类的重复加载,并确保了核心类库的唯一性。 二、...

    classloader 加密解密应用程序 ,反编译class

    在`ClassLoader`的层次结构中,有三个基本的类加载器:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap ClassLoader加载JRE的核心库,Extension ClassLoader加载Java扩展目录下的类,而...

    自定义类加载器

    在Java编程语言中,类加载器(ClassLoader)是运行时环境的一个重要组成部分,它负责将类的字节码从各种来源加载到Java虚拟机(JVM)中,从而使得程序可以执行。自定义类加载器允许开发人员根据特定需求定制加载类的...

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

    Java加壳技术是一种保护Java程序不被轻易反编译或篡改的安全手段,它通过自定义类加载器来实现对原始字节码的包装。在Java中,类加载器是负责加载类到JVM(Java虚拟机)的核心组件。自定义类加载器允许开发者根据...

    Java SE: ClassLoader in depth

    深入理解ClassLoader是深入理解Java动态加载机制、自定义类加载器以及对类的热部署等高级特性的重要基础。 在Java中,ClassLoader遵循的是委托模型(Delegation Model)。当一个类加载器接收到一个类加载请求时,它...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    例如,自定义类加载器可以用于实现热部署、类隔离、加密加载等高级功能。 总的来说,ClassLoader是Java平台的核心组件之一,它的设计和实现对于理解JVM的工作原理至关重要。深入学习ClassLoader不仅可以提高编程...

    深入探讨 Java 类加载器

    除了这三种系统类加载器,还可以自定义类加载器,满足特定的加载需求,例如加载网络上的类或加密后的类文件。 类加载器的代理模式体现在父子加载器的关系上。当一个类加载器尝试加载类时,它会先委托给父类加载器,...

    java classLoader 的全面讲解

    Java 类加载器(ClassLoader)是Java虚拟机(JVM)中的一个重要组成部分,它负责加载类的字节码文件,使得程序能够运行。深入理解ClassLoader对于优化应用性能、处理类加载问题以及实现自定义加载策略至关重要。 一...

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    例如,可以实现一个只加载指定目录下类的类加载器,或者实现一个能加载加密或压缩格式的类文件的类加载器。 此外,"classloader-playground"还可能包含对线程上下文类加载器(Thread Context ClassLoader)的理解和...

    java class loader(JAVA类加载器)

    Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。启动类加载器负责加载JRE核心库,如`rt.jar`;扩展类加载器...

    Java类加载器的详解

    4. **自定义类加载器(User-defined ClassLoader)**:用户可以根据需要创建自己的类加载器,用于加载特定位置的类,例如从网络、数据库或者加密文件中加载类。 类加载的过程遵循“双亲委派模型”: 1. **加载...

    Java类加载说明

    在这个过程中,类加载器(ClassLoader)扮演着关键角色,它负责查找并加载Java类的字节码文件。本文将深入探讨Java类加载的原理、过程以及相关知识点。 首先,我们需要理解类加载的三个基本阶段:加载、验证、准备...

    Java类加载器机制与模型.pdf

    自定义类加载器允许开发者根据特定需求编写自己的加载逻辑,比如加密类文件防止反编译,或者从网络、数据库等非传统源加载类。类加载器之间形成了一种层次结构,称为**类加载器层次体系**,每个类加载器都有明确的...

    java class 加密

    例如,`classloader.dll`和`libclassloader.so`可能就是自定义的类加载器,它们可以在加载类时处理加密内容。 动态加密则是在程序运行时对类文件进行实时加密和解密。这种方法通常涉及自定义类加载器,它在加载类时...

    java classloader讲义-淘宝网

    Java中类加载器遵循双亲委派模型,即当一个类加载器收到加载类的请求时,首先将这个请求委派给父类加载器去完成,只有当父类加载器无法完成时才自己尝试加载。这种机制保证了Java平台的基础稳定性和安全性。 #### ...

    类加载器加载过程.rar

    在Java编程语言中,类加载器(ClassLoader)是至关重要的组成部分,它负责将类的字节码转换为可执行的Java对象。理解类加载器的工作原理对于深入掌握Java虚拟机(JVM)运行机制和进行高效的问题排查至关重要。在这个...

    浅析ClassLoader

    2. 类加载器分类:Java中的ClassLoader有三种基本类型:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。Bootstrap加载JDK核心库,Extension...

    ClassLoader 详解.doc

    自定义ClassLoader是Java平台的一大特色,开发人员可以根据需要创建自己的类加载器,例如实现模块化、热部署或者加密解密类等高级功能。自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载...

Global site tag (gtag.js) - Google Analytics