|
@@ -0,0 +1,68 @@
|
|
|
|
|
+package course;
|
|
|
|
|
+
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.io.InputStream;
|
|
|
|
|
+import java.util.Properties;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author WanJl
|
|
|
|
|
+ * @version 1.0
|
|
|
|
|
+ * @title Demo03
|
|
|
|
|
+ * @description 双亲委派模型
|
|
|
|
|
+ * @create 2026/8/12
|
|
|
|
|
+ */
|
|
|
|
|
+public class Demo03 {
|
|
|
|
|
+ /*
|
|
|
|
|
+ 如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委派给父类加载器去执行,如果父类加载器还存在父类加载器就会进一步委派,
|
|
|
|
|
+ 依次递归,请求最终会委派到最顶层的类加载器,如果顶层的类加载器能过完成加载任务,就成功返回。如果无法完成,子类加载器才会尝试自己去加载,这种模式就是双亲委派模型。
|
|
|
|
|
+
|
|
|
|
|
+ getSystemClassLoader() 获取系统类加载器
|
|
|
|
|
+ getResourceAsStream() 加载某一个资源文件
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ 为什么需要双亲委派模型?
|
|
|
|
|
+ 避免类被重复加载:同一个类在整个JVM中只有一个Class对象(类的唯一性是由 类+类加载器 共同决定的),双亲委派机制可以保证任意一个类都只被加载一次。
|
|
|
|
|
+ 保证核心类库的安全:防止用户编写一个假的 核心类 混入到系统中,双亲委派机制会依次把请求交给最顶层的类加载器,
|
|
|
|
|
+ 比如 java.lang.String类只能由顶层的启动类加载器进行加载,用户自定义的同名类永远不会被加载。
|
|
|
|
|
+ 保证类的唯一性:
|
|
|
|
|
+ 即使我们自定义了类加载器,加载了 自定义的 java.lang.String类,但是由于双亲委派机制,实际上加载的还是最顶层的类加载器加载的核心类,
|
|
|
|
|
+ 避免了出现多份不同的String类型的导致的类型混乱。
|
|
|
|
|
+
|
|
|
|
|
+ */
|
|
|
|
|
+ public static void main(String[] args) throws IOException {
|
|
|
|
|
+ // --- 下面代码的过程 ,其实是编写代码加载资源配置文件的过程
|
|
|
|
|
+ //获取系统类加载器
|
|
|
|
|
+ ClassLoader classLoader = ClassLoader.getSystemClassLoader();
|
|
|
|
|
+
|
|
|
|
|
+ //利用类加载器加载一个指定文件
|
|
|
|
|
+ //参数:文件的路径
|
|
|
|
|
+ //返回值:字节流
|
|
|
|
|
+ InputStream inputStream = classLoader.getResourceAsStream("prop.properties");
|
|
|
|
|
+
|
|
|
|
|
+ //创建解析properties文件的对象 Properties-它的父类是Hashtable 是Map集合接口的另一个实现类 底层是数组
|
|
|
|
|
+ Properties pro=new Properties();
|
|
|
|
|
+ //加载输入流对象 -- 其实就是加载我们指定的文件
|
|
|
|
|
+ pro.load(inputStream);
|
|
|
|
|
+
|
|
|
|
|
+ //获取指定的配置信息
|
|
|
|
|
+ String driver = pro.getProperty("db.driver");
|
|
|
|
|
+ String url = pro.getProperty("db.url");
|
|
|
|
|
+ String username = pro.getProperty("db.username");
|
|
|
|
|
+ String password = pro.getProperty("db.password");
|
|
|
|
|
+
|
|
|
|
|
+ //调用连接数据库的方法,执行连接数据库的操作....
|
|
|
|
|
+ 链接数据库的方法(driver,url,username,password);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //输出
|
|
|
|
|
+ System.out.println(pro);
|
|
|
|
|
+ //关闭流
|
|
|
|
|
+ inputStream.close();
|
|
|
|
|
+
|
|
|
|
|
+ // xml / json / yaml
|
|
|
|
|
+ }
|
|
|
|
|
+ public static void 链接数据库的方法(String driver,String url,String username,String password){
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|