• 【从入门到入土】Java SE 反射机制1(从JDBC回来的!!)


    目录

    1、关于反射机制

    1.1 反射机制有什么用?

    1.2、反射机制的相关类在哪个包下?

    1.3、反射机制相关的重要的类有哪些?

    1.4 在java中获取Class的三种方式

    1.5 获取了Class之后,可以调用无参数构造方法来实例化对象

    1.6、如果你只想让一个类的“静态代码块”执行的话,你可以怎么做?

    1.7、关于路径问题

    1.8 IO流方式读取配置文件

    1.9 直接以流的形式返回:

    1.10 IO + Properties,怎么快速绑定属性资源文件

    2、关于JDK中自带的类加载器:

    2.1 什么是类加载器?

    2.2 JDK中自带了3个类加载器

    2.3 关于三个类加载器

    2.4 java中为了保证类加载的安全,使用了双亲委派机制。


    *

    1、关于反射机制

    1.1 反射机制有什么用?

    ​ 通过java语言中的反射机制可以操作字节码文件。
    ​ 优点类似于黑客。(可以读和修改字节码文件。)
    ​ 通过反射机制可以操作代码片段。(class文件。)

    反射机制使得对象的创建更加地灵活,可以通过读取配置文件的方式随意改变new的对象,不会将java代码写死

    1.2、反射机制的相关类在哪个包下?

    java.lang.reflect.*;
    

    1.3、反射机制相关的重要的类有哪些?

    ​ java.lang.Class:代表整个字节码,代表一个类型,代表整个类。

    ​ java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。

    ​ java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法

    ​ java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。

    1. java.lang.Class:
    2. public class User{
    3. // Field
    4. int no;
    5. // Constructor
    6. public User(){
    7. }
    8. public User(int no){
    9. this.no = no;
    10. }
    11. // Method
    12. public void setNo(int no){
    13. this.no = no;
    14. }
    15. public int getNo(){
    16. return no;
    17. }
    18. }

    1.4 在java中获取Class的三种方式

    ​ 第一种:

    1. Class c = Class.forName("完整类名");
    2. //这个完整的类名可以通过读取配置文件的方式获取

    ​ 第二种:

    Class c = 对象.getClass();
    

    ​ 第三种:

    1. Class c = int.class;
    2. Class c = String.class;

    1.5 获取了Class之后,可以调用无参数构造方法来实例化对象

    ​ //c代表的就是日期Date类型
    ​ Class c = Class.forName(“java.util.Date”);

    ​ //实例化一个Date日期类型的对象
    ​ Object obj = c.newInstance();

    ​ 一定要注意:
    ​ newInstance()底层调用的是该类型的无参数构造方法。
    ​ 如果没有这个无参数构造方法会出现"实例化"异常。

    1.6、如果你只想让一个类的“静态代码块”执行的话,你可以怎么做?

    ​ Class.forName(“该类的类名”);
    ​ 这样类就加载,类加载的时候,静态代码块执行!!!!
    ​ 在这里,对该方法的返回值不感兴趣,主要是为了使用“类加载”这个动作。

    1.7、关于路径问题

    1. String path = Thread.currentThread().getContextClassLoader()
    2. .getResource("写相对路径,但是这个相对路径从src出发开始找").getPath();
    3. String path = Thread.currentThread().getContextClassLoader()
    4. .getResource("abc").getPath(); //必须保证src下有abc文件。
    5. String path = Thread.currentThread().getContextClassLoader()
    6. .getResource("a/db").getPath(); //必须保证src下有a目录,a目录下有db文件。
    7. String path = Thread.currentThread().getContextClassLoader()
    8. .getResource("com/bjpowernode/test.properties").getPath();
    9. //必须保证src下有com目录,com目录下有bjpowernode目录。
    10. //bjpowernode目录下有test.properties文件。

    ​ 这种方式是为了获取一个文件的绝对路径。(通用方式,不会受到环境移植的影响。),但是该文件要求放在类路径下,换句话说:也就是放到src下面。

    ​ src下是类的根路径。

    1.8 IO流方式读取配置文件

    1. //获取一个文件的绝对路径
    2. String path = Thread.currrntThread().getContextClassLoader()
    3. .getResource("classinfo2.properties").getPath();
    4. FileReader reader = new FileReader(path);
    5. Properties pro = new Properties();
    6. pro.load(reader);
    7. reader.close();
    8. //通过key获取value
    9. String class Name = pro.getProperty("className");
    10. //这里就得到了配置文件中的Name信息,从而可以使用反射机制来new对象
    11. System.out.println(className);

    1.9 直接以流的形式返回:

    1. InputStream reader = Thread.currentThread().getContextClassLoader()
    2. .getResourceAsStream("com/bjpowernode/test.properties");
    3. Properties pro = new Properties();
    4. pro.load(reader);
    5. reader.close();
    6. //通过key获取value
    7. String class Name = pro.getProperty("className");
    8. System.out.println(className);

    1.10 IO + Properties,怎么快速绑定属性资源文件

    ​ //要求:第一这个文件必须在类路径下
    ​ //第二这个文件必须是以.properties结尾。

    1. ResourceBundle bundle = ResourceBundle.getBundle("com/bjpowernode/test");
    2. String value = bundle.getString(key);

    2、关于JDK中自带的类加载器:

    2.1 什么是类加载器?

    ​ 专门负责加载类的命令/工具。ClassLoader

    2.2 JDK中自带了3个类加载器

    ​ 启动类加载器:rt.jar
    ​ 扩展类加载器:ext/*.jar
    ​ 应用类加载器:classpath

    2.3 关于三个类加载器

    假设有这样一段代码:

    	String s = "abc";
    

    代码在开始执行之前,会将所需要类全部加载到JVM当中。
    通过类加载器加载,看到以上代码类加载器会找String.class文件,找到就加载,那么是怎么进行加载的呢?

    • 首先通过“启动类加载器”加载。
      注意:启动类加载器专门加载:C:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar。
      rt.jar中都是JDK最核心的类库。
    • 如果通过“启动类加载器”加载不到的时候,会通过"扩展类加载器"加载。
      注意:扩展类加载器专门加载:C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext*.jar
    • 如果“扩展类加载器”没有加载到,那么会通过“应用类加载器”加载。
      注意:应用类加载器专门加载:classpath中的类。

    2.4 java中为了保证类加载的安全,使用了双亲委派机制。

    ​ 优先从启动类加载器中加载,这个称为“父”。“父”无法加载到,再从扩展类加载器中加载,这个称为“母”。双亲委派。如果都加载不到,才会考虑从应用类加载器中加载。直到加载到为止。

  • 相关阅读:
    ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
    地理探测器R语言实现:geodetector
    单片机核心/RTOS必备 (ARM汇编)
    形式化验证方法研究综述
    重新认识mysql事务
    软件工程开发模式:从传统到现代的演进
    【附源码】计算机毕业设计JAVA宠物管理系统
    php-java-net-python-北京名胜古迹展览网站计算机毕业设计程序
    Mozilla Firefox 浏览器
    【情态动词练习题】Can / Could you
  • 原文地址:https://blog.csdn.net/m0_61163395/article/details/125433815