LLL

java反射机制

有 N 人看过

看的springboot学习视频,上来就写了不少@的注解编程,

作为一个之前基本只认识@override的小白,在网上详细了解注解编程的时候,

发现了反射这个似曾相识的知识点,之前在做数据库大作业的时候,用到过:

Class.forName("com.mysql.cj.jdbc.Driver");

这么一句代码,当时也不太清楚是什么意思,只是知道大概是导入这个类。

现在看了一下反射的原理,大概明白了一点。

一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。

Apple apple = new Apple(); //直接初始化,「正射」
apple.setPrice(4);

而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。

这时候,我们使用 JDK 提供的反射 API 进行反射调用:

Class clz = Class.forName("com.study.reflect.Apple");
Method method = clz.getMethod("setPrice", int.class);
Constructor constructor = clz.getConstructor();
Object object = constructor.newInstance();
method.invoke(object, 4);

上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,第一段代码在未运行时就已经确定了要运行的类(Apple),而第二段代码则是在运行时通过字符串值才得知要运行的类(com.study.reflect.Apple)。

所以说什么是反射?

反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

至于现在学习重点还不在这边,先了解一下原理,以后深入。

至于

Class.forName("com.mysql.cj.jdbc.Driver");

我们知道Class.forName() 方法要求JVM查找并加载指定的类到内存中,此时将”com.mysql.jdbc.Driver” 当做参数传入,就是告诉JVM,去”com.mysql.jdbc”这个路径下找Driver类,将其加载到内存中。经过一系列操作将mysql驱动注册到DriverManager中去

注册到DriverManager中之后,我们就可以通过DriverManager的getConnection方法获得mysql的连接了:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");