image.png

Long

伪装的java.lang.Long

  1. package java.lang;
  2. public class Long {
  3. static {
  4. System.out.println("I am bad Long.");
  5. }
  6. public Long(long value) {
  7. }
  8. }

LongDemo

  1. package com.javabook.classloader.java.lang.security;
  2. /**
  3. * @author Summer Lu
  4. * @email gmluyang@gmail.com
  5. * @date 2014-8-25
  6. *
  7. */
  8. public class LongDemo {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. // 实际上代码无法加载这个伪装的Long,最终得到的还是JDK API中提供的Long
  14. // 类加载器通过双亲委托模式,最终使用启动类加载器得到JDK API中提供的Long
  15. Long badLong = new Long(1);
  16. System.out.println("ClassLoader:" + badLong.getClass().getClassLoader());
  17. }
  18. }

LongDemo Console

  1. ClassLoader:null

Virus

伪装成java.lang下的类

  1. package java.lang;
  2. public class Virus {
  3. public void whoAmI() {
  4. System.out.println("I am " + this.getClass() +
  5. ", load by [" + this.getClass().getClassLoader() + "]");
  6. }
  7. }

VirusDemo

  1. package com.javabook.classloader.java.lang.security;
  2. /**
  3. * @author Summer Lu
  4. * @email gmluyang@gmail.com
  5. * @date 2014-8-25
  6. *
  7. */
  8. public class VirusDemo {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. // 和伪装的java.lang.Long不同,启动类加载器不能在JDK API中找到到Virus这个类
  14. // ClassLoader.preDefineClass方法通过判断包路径来决定是否加载或抛出安全异常
  15. // 当启动类加载器无法在java.*包路径中找以java作为包名的类则抛出安全异常
  16. Virus virus = new Virus();
  17. virus.whoAmI();
  18. }
  19. }

VirusDemo Console

  1. Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
  2. at java.lang.ClassLoader.preDefineClass(ClassLoader.java:655)
  3. at java.lang.ClassLoader.defineClass(ClassLoader.java:754)
  4. at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  5. at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
  6. at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
  7. at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
  8. at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
  9. at java.security.AccessController.doPrivileged(Native Method)
  10. at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
  11. at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
  12. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
  13. at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
  14. at com.javabook.classloader.java.lang.security.VirusDemo.main(VirusDemo.java:20)