走进舒适圈の小窝

Loading...

Java基础 —— 反射

动态语言

 动态语言,是指程序在运行时可以改变其结构(新函数可以引进,已有的函数可以被删除等结构上的变化)。如:JavaScript、Python就属于动态语言,而C、C++则不属于动态语言,从反射的角度说,Java属于半动态语言。

反射

 反射就是在运行状态时,对任意一个类,都能知道类中的属性和方法,对任意一个对象,都能调用它的任意属性和方法(动态获取信息、动态获取对象)。

框架 = 反射 + 注解 + 设计模式

Class对象

 程序运行时,编写的每一个类都会被编译成.class文件,当我们new对象或者类加载器加载时,JVM会将.class文件加载到内存中,即当一个类加载器完成之后,在堆内存的方法区中生成了一个该类唯一的class对象。

获取Class对象的四种方式

  • 通过Object类中的getClass()方法获取
  • 通过类名.class直接获取
  • 通过Class类中的forName()方法获取(推荐)
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> name = Class.forName("reflect.Person");
        //获取类中所以方法信息
        Class<?>[] declaredClasses = name.getDeclaredClasses();
        for (Class<?> declaredClass : declaredClasses) {
            System.out.println(declaredClass.toString());
        }
        //获取类中所有属性信息
        Field[] fields = name.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.toString());
        }
        //获取类中所有构造方法信息
        Constructor<?>[] declaredConstructors = name.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.toString());
        }
    }
}
  • 通过类加载器ClassLoader获取

创建对象的两种方式

  • Class对象的newInstance()方法

这种方法要求该Class对象对应的类有空参构造

  • Constructor对象的newInstance()方法

先调用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法创建Class对象对应类的实例

应用场景

  • 加载数据库驱动

在我们做项目时,底层数据库有时用MySQL,有时用Oracle,这时候我们就需要动态的去加载数据库驱动类;如:使用JDBC连接数据库时,利用Class.forName()方法通过反射加载数据库。

public class JDBCUtils {
    public static final String url = "jdbc:mysql://localhost:3306/crm";
    public static final String username = "root";
    public static final String password = "root";
    //3.加载驱动  反射技术
    //静态代码块 优先于任何程序运行,并且只运行一次
    static{
        try {//异常体系
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //4.由驱动管理器获取连接
    //静态方法  无须创建对象直接使用类名来调用
    //静态方法不能调用普通属性
    public static Connection getConnection() throws SQLException {
        Connection connection = DriverManager.getConnection(url, username, password);
        return connection;
    }
}
  • 加载配置文件

像Spring框架中的IOC容器

posted @ 2024-12-08 15:50  走进舒适圈  阅读(8)  评论(0编辑  收藏  举报