Java反射原理与使用

article/2025/9/21 3:42:59

当类加载器将类加载进jvm之后,jvm会创建每一个类的元数据对象(Class),这个元数据对象(Class)记录着这类的所有信息,java语言允许通过元数据对象动态的创建对象实例,这种机制就称为java的反射机制,基本上所有框架的底层都用到了反射机制,spring、mybatis、servlet都用到了

1.如何获取一个类的元数据对象(Class)呢

现在有一个User类

package com.niu.demo;public class User {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

获取User的元数据对象(Class)方式

public class Main2 {public static void main(String[] args) {Class<User> aClass1 = User.class; // 1、类名.classClass<?> aClass2 = Class.forName("com.niu.demo.User"); //2、类完整的路径名User user = new User();Class<? extends User> aClass = user.getClass(); //3、对象引用.getClass()方式}
}

2.如何通过类的元数据对象(Class)创建对象呢

我们采用第一种获取Class对象的方式

Class<User> aClass1 = User.class; // 1、类名.class
User user = aClass1.newInstance();

这样就完成了通过反射的方式完成了类的创建

3.还可以对通过Class对象做什么

我们可以通过元数据Class对象获取对象的所有信息,如方法、属性、父类、接口、构造器。。。。

3.1 给属性赋值

public class Main2 {public static void main(String[] args) throws Exception {//1、第一种方式User user = new User();user.setName("张三");System.out.println(user.getName());//通过反射给属性赋值 传入属性名Field field = user.getClass().getDeclaredField("name");field.setAccessible(true);field.set(user,"李四");System.out.println(user.getName());//2、第二种方式User user1 = User.class.newInstance();user1.setName("王五");System.out.println(user1.getName());}
}

输出

3.2 反射调用对象方法

我们在User加入如下方法

    public boolean passwordCheck(String password){if (password==null || password.length()<3){System.out.println("password can't be used");return false;}else {System.out.println("password is ok");return true;}}

调用测试

    public static void main(String[] args) throws Exception {User user = new User();//传入方法名和参数类型Method passwordCheck = user.getClass().getDeclaredMethod("passwordCheck",String.class);Object invoke1 = passwordCheck.invoke(user, "12");System.out.println(invoke1);Object invoke2 = passwordCheck.invoke(user, "123");System.out.println(invoke2);}

输出

4、框架里是如何使用反射的

tomcat里web.xml

 <servlet><servlet-name>HelloServlet</servlet-name><servlet-class>servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/servlet/HelloServlet</url-pattern></servlet-mapping>

其中:<servlet-class>配置的完整类路径,然后通过Class.forName()来实例化servlet

spring的ioc  mybatis的mapper等等等等。。。 都是用到了反射


http://chatgpt.dhexx.cn/article/80daGIYF.shtml

相关文章

Java反射原理简析

Java的反射机制允许我们动态的调用某个对象的方法/构造函数&#xff0c;获取某个对象的属性等&#xff0c;而无需在编码时确定调用的对象。这种机制在我们常用的框架中也非常常见。 1.原理简介 类actionClass Class.forName&#xff08;“ MyClass”&#xff09;; 对象actio…

java反射原理

一、反射机制 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态(在运行时)获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制。简单来说,就是Java对每一个类和类中的所有成…

Java反射(原理剖析与使用)

一、反射机制是什么 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c;再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 2、Java属于先编译再运行的语言&a…

java反射机制原理详解

Java反射机制是指在运行时动态地获取一个类的信息并能够操作该类的属性和方法的能力。Java反射机制使得程序能够在运行时借助Class类的API来操作自身的属性和方法&#xff0c;从而大大增强了Java的灵活性和可扩展性。本文将详细介绍Java反射机制的原理以及如何使用它。 1、反射…

Java 反射及原理

反射&#xff0c;指的是对于任意一个类&#xff0c;都可以动态的获得它的所有属性和方法&#xff0c;对于任意一个对象都能调用的它的所有属性和方法&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。…

回车、换行、回车换行、硬回车以及软回车

回车、换行、回车换行、硬回车以及软回车 要想一句话说清楚它们之间的关系&#xff0c;不太简单。但认真看完后&#xff0c;会发现它们之间的关系其实也挺简单的。 回车、换行与回车换行 英文缩写对应按键英文全称中文名称解释转义表达式使用平台CRreturnCarriage Return回车…

图解回车和换行的区别

文章目录 1. 定义2. 图解3. 讨论4. 结论 1. 定义 中文英文简写HEXCharacterASCII回车Carriage returnCR0x0D\r13换行Line feedLF0x0A\n10 2. 图解 Win11 Experiment by Pycharm with Python 3.9 print(---)print(Hello World)print(---)# \rprint(Hello \r World)print(---…

不同系统下回车和换行的区别

在计算机还没有出现之前&#xff0c;有一种叫做电传打字机&#xff08;Teletype Model 33&#xff09;的玩意&#xff0c;每秒钟可以打10个字符。但是它有一个问题&#xff0c;就是打完一行换行的时候&#xff0c;要用去0.2秒&#xff0c;正好可以打两个字符。要是在这0.2秒里面…

python回车和换行的区别_回车与换行的区别(转)

add by zhj: 不同操作系统下换行符不同&#xff0c;如下&#xff1a; \n: UNIX \n\r: window \r: MAC OS 我们经常遇到的一个问题就是&#xff0c;Unix/Mac系统下的文件在Windows里打开的话&#xff0c;所有文字会变成一行&#xff1b;而Windows里的文件在Unix/Mac下打开的…

回车与换行的区别,CRLF、CR、LF详解(\r \n \r\n的区别)

先上结论 缩写ASCⅡ转义系统ASCⅡ值CR\rMacIntosh&#xff08;早期的Mac&#xff09;13LF\nUnix/Linux/Mac OS X10CR LF\r\nWindows 很长一段时间里&#xff0c;对于CRLF、CR、LF的理解仅限于不同操作系统下对换行符的定义。所谓知其然需知其所以然&#xff0c;从学习中找到乐…

回车符,换行符的区别

首先介绍一下“回车”&#xff08;carriage return,’\r’&#xff09;和“换行”&#xff08;line feed,’\n’&#xff09;这两个概念的来历和区别。在计算机还没有出现之前&#xff0c;有一种叫做电传打字机&#xff08;Teletype Model 33&#xff09;的玩意&#xff0c;每秒…

换行和回车的区别

我们在看他们的区别时我们先看看他们的分别指的是什么&#xff1a; 回车<\r>(carriage return)&#xff1a;告诉打印机把打印头定位到左边界&#xff0c;就是指的&#xff0c;那个打印头重新放在这一行的开始。 换行<\n>(line feed)&#xff1a;告诉打印机把打印头…

回车符和 换行符的区别

首先介绍一下“回车”&#xff08;carriage return,’\r’&#xff09;和“换行”&#xff08;line feed,’\n’&#xff09;这两个概念的来历和区别。在计算机还没有出现之前&#xff0c;有一种叫做电传打字机&#xff08;Teletype Model 33&#xff09;的玩意&#xff0c;每秒…

回车符、换行符和回车换行符

我的CSDN主页My Python 学习个人备忘录我的HOT博 自学并不是什么神秘的东西&#xff0c;一个人一辈子自学的时间总是比在学校学习的时间长&#xff0c;没有老师的时候总是比有老师的时候多。             ——华罗庚 \r 、\n 和 \r\n 题目代码运行效果我的解题思路…

回车符与换行符的区别

引用了博客&#xff1a;https://blog.csdn.net/fanwenbo/article/details/54848429 这里是我自己做的实验&#xff0c;如下&#xff1a; printf("A is here!");printf("I am here!");putchar(\r);printf("First input!");putchar(\n);printf(&qu…

“回车”、“换行”浅谈

“回车”、“换行”浅谈 转义字符\r表示回车&#xff08;carriage return&#xff09;即回到行首&#xff0c;并没有包含换行的动作&#xff0c; \n表示换行&#xff08;line feed&#xff09;即移动到新的一行&#xff08;下一行&#xff09;。顺便提及&#xff0c;\b表示退格…

回车与换行符的区别及python中使用

一、区别 转载自http://www.pythontab.com/html/2017/linuxkaiyuan_0115/1116.html 1. 由来 在计算机还没有出现之前&#xff0c;有一种叫做电传打字机&#xff08;Teletype Model 33&#xff09;的机械打字机&#xff0c;每秒钟可以打10个字符。但是它有一个问题&#xff0c…

回车和换行的区别

回车和换行的区别 回车和换行的概念不同的系统间传递文件会涉及格式的转换Unix -> WindowsUnix <- Windows 回车和换行的概念 首先介绍一下“回车”&#xff08;carriage return,’\r’&#xff09;和“换行”&#xff08;line feed,’\n’&#xff09;这两个概念的来历…

在数组中查找指定元素 (15分)

int search( int list[], int n, int x ){int index -1;for(int i0;i<n;i){if(list[i] x){index i;break;}}return index; }

[PTA]习题8-2 在数组中查找指定元素

Spring-_-Bear 的 CSDN 博客导航 本题要求实现一个在数组中查找指定元素的简单函数。 函数接口定义&#xff1a; int search( int list[], int n, int x );其中 list[] 是用户传入的数组&#xff1b;n&#xff08;≥0&#xff09;是 list[] 中元素的个数&#xff1b;x 是待查…