动态语言

 动态语言,是指程序在运行时可以改变其结构(新函数可以引进,已有的函数可以被删除等结构上的变化)。如: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基础 —— 反射的更多相关文章

  1. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  2. Java基础——反射

    今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...

  3. Java基础反射(二)

    原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...

  4. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  5. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  6. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  7. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

  8. Java基础—反射(转载)

    转载自: JAVA反射与注解 JAVA反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射机制是什么 反射 ...

  9. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  10. Java基础—反射与代理(新手向)

    第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...

随机推荐

  1. 论文解读《MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots》

    导言 ​ 在参加东南大学网络安全学院夏令营的契机下,我第一次接触大模型安全领域.L老师是网络安全领域的一位大牛,在和L老师交流期间,被告知需要准备一次paper presentation介绍四大会中感 ...

  2. 大模型应用开发初探 : 基于Coze创建Agent

    大家好,我是Edison. 最近学习了一门课程<AI Agent入门实战>,了解了如何在Coze平台上创建AI Agent,发现它对我们个人(C端用户)而言十分有用,分享给你一下. Coz ...

  3. duxui:基于Taro,兼容React Native、小程序、H5的多端UI库

    duxui是duxapp官方开发的一款兼容多端的UI组件库,兼容小程序.H5.React Native,库中提供了60+的组件,覆盖大部分使用场景 它能帮助你通过统一的组件样式,快速完成多端应用的开发 ...

  4. 进程管理中的active_mm是做什么的?

    在Linux内核中,进程管理涉及到许多复杂的数据结构和机制,其中active_mm是与内存管理相关的一个关键概念.理解active_mm需要先了解与之相关的一些基本内核结构和概念. 基本概念 mm_s ...

  5. window配置onnxruntime,运行c++版本

    为了使用ONNX-Runtime-Inference这个项目,但是我缺少onnxruntime这个库, 网上找了很多教程,但是大多数都是关于linux的,这里简单记录一下我的配置流程 找到onnxru ...

  6. CF753B题解

    这应该算是一个很脍炙人口的小游戏了吧 (没玩过算我没说) 因为一共有 \(50\) 次询问机会,那最简单直接的方法就不难想到. 我们把 \(0 \sim9\) 全部询问一遍,如果回答两个整数不全为 \ ...

  7. 2023年3月中国数据库排行榜:开源OTO揽获前三,传统达梦、GBase触机便发

    东风何时至,已绿湖上山. 春风送来了2023年3月的 墨天轮中国数据库流行度排行,本月共有260个数据库参与排名,本月榜单前十可以用一句话概括为:榜单前八较上月岿然不动,GBase 奋勇向前重返第九. ...

  8. vue前端开发仿钉图系列(7)底部数据列表的开发详解

    底部数据列表主要是记录图层下面对应的点线面数据,点击单元行或者查看或者编辑,弹出右侧编辑页面,点击单元行地图定位到相应的绘图位置.里面的难点1是动态绑定字段管理编辑的字段以及对应的value值,2是点 ...

  9. 组件传参v-model语法糖只能写一次的解决办法

    v-model 的使用 解决只能使用一次v-model的问题:使用 sync 修饰符

  10. nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发

    在现今国产化浪潮的驱动下,跨平台或者缩小范围说基于国产化Linux或者基于国产鸿蒙系统的开发才是未来的趋势了,风口浪尖上,我们开发人员也只能顺势而为,本篇随笔介绍在Python开发中,使用使用Pyth ...