五、ClassLoader

1.什么是ClassLoader

2.四种ClassLoader

3.自定义CLassLoader

(1)MyClassLoader

public class MyClassLoader extends ClassLoader {
private String path;
private String classLoaderName; public MyClassLoader(String path, String classLoaderName) {
this.path = path;
this.classLoaderName = classLoaderName;
} //用于寻找类文件
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
} //用于加载类文件
private byte[] loadClassData(String name) {
name = path + name + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(new File(name));
out = new ByteArrayOutputStream();
int i = 0;
while ((i = in.read()) != -1) {
out.write(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}

原理还是通过ClassLoader中的deFineClass方法来获取Class类型对象,自定义的是路径

(2)实现ClassLoaderChecker

public class ClassLoaderChecker {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
Class c = m.loadClass("Wali");
c.newInstance();
}
}

(3)实现效果

4.类加载器的双亲委派机制

为什么要使用双亲委派机制来加载class文件-避免多份同样的字节码的加载

5.类的加载方式

隐式加载:new

显示加载:loadClass,formName

(1)类装载过程

(2)代码实例区别

public class LoadDifference {
public static void main(String[] args) throws Exception {
//loadClass加载类,需要调用c.newInstance()才会加载类
ClassLoader cl = Robot.class.getClassLoader();
Class c = cl.loadClass("com.interview.javabasic.reflect.Robot");
c.newInstance();
//forName加载类,在加载类的时候会将Static静态代码块的代码实现出来
Class r = Class.forName("com.interview.javabasic.reflect.Robot");
}
}

使用Class.forName(classname)才能在反射回去类的时候执行static块。(3)数据库链接为什么使用Class.forName(className)

最新文章

  1. Apache执行Python脚本
  2. Mono 3.2 上跑NUnit测试
  3. Scala HandBook
  4. 【OpenStack】OpenStack系列12之OpenStack自动化测试详解
  5. jdk1.7的collections.sort(List list)排序问题
  6. 【转】Android异步消息处理机制完全解析,带你从源码的角度彻底理解
  7. C++ Primer 随笔 Chapter 4 数组和指针
  8. Weblogic虚拟目录
  9. ASP.NETCore的Kestrel服务器
  10. 【Android】自己动手做个扫雷游戏
  11. table index & delete array item
  12. execution(* com.sample.service.impl..*.*(..))
  13. MySQL常用内置变量
  14. 【Python全栈-后端开发】数据库进阶
  15. 使用JDBC一次执行多条语句(以MySQL为例)
  16. 一个简单好用的http服务器
  17. struts2的DevMode(开发模式)模式
  18. 数据立方体(Cube)
  19. 【Head First Servlets and JSP】笔记 25:JSTL 参考
  20. c#枚举的描述和值

热门文章

  1. PHP数组和对象之间的互换
  2. java lesson14Homework
  3. JavaScript例子2-使一个特定的表格隔行变色
  4. linux mint 安装微信2
  5. [Android] Installation failed due to: ''pm install-create -r -t -S 4590498' returns error 'UNSUPPORTED''
  6. 帝国cms 加载更多的实现(父栏目以及子栏目都可以实现)
  7. 微信小程序页面跳转传参方式
  8. vue 项目中如何在页面刷新的状态下保留数据
  9. 第十三章、元类(metaclass)
  10. 由于MTU设置不当导致的访问超时