자바 기반 9:자바 의 클래스 로 더 설명,class 파일 암호 화,사용자 정의 ClassLoader

4867 단어 자바extF#
/**
 * 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 {

}

좋은 웹페이지 즐겨찾기