我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java重点:反射机制的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java重点:反射机制的使用

目录

一、概念

二、类类

1、类类的获取方式

1)类名.Class

2)对象.getClass()

3)Class.forName()

三、反射实例化

1、调用一个公有的无参构造方法

2、调用一个公有的一个参构造方法

3、调用一个公有的两个参构造方法

4、调用一个私有的一个参构造方法

四、反射:方法调用

1、公有无参

2、公有有参

3、私有有参

完整代码:

五、反射:读写属性


一、概念

J2EE中的反射(Reflection)是指在程序运行期间访问、检测和修改自身的状态或行为。通过反射,可以动态地获取一个类的所有成员变量、方法、构造函数等信息,并且可以在运行时调用这些成员。在J2EE中,反射可以方便实现一些框架ORM工具,以及其他动态性要求的应用程序。

什么是反射?

反射(Reflection)是一种在运行时动态地获取和操作对象的能力,它允许程序通过对象的类类型来了解对象的成员和方法,并且可以在运行时调用这些成员和方法。反射可以用于许多目的,例如在运行时动态加载类、实例化对象、查看和修改对象的属性和方法、调用私有方法和构造函数,等等。在Java中,反射通过java.lang.reflect包中的类和接口来实现。反射的优点是可以使我们的代码更加灵活和动态,但是反射的开销比较大,因此在性能要求较高的情况下,应该谨慎使用。

总的来说:反射Java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

二、类类

在Java反射(reflection)中,Class类被称为“类类”(class of class),因为它代表了JVM中的一个类。每个Java类在内存中都有一个对应的Class类实例对象,可以通过Java的反射机制获取。通过这个实例,我们可以动态地获取创建操作一个类的各种元数据(如属性、方法、注解等),并可以在程序运行时动态地创建、修改该类的对象。通过反射,我们可以实现更加灵活和动态的编程方式,可以在编码阶段不确定访问的类和方法,直到运行时才确定需要获取和调用的类和方法。

1、类类的获取方式

Object类中的getClass()方法:可以获取一个对象所属的类。

类名.class:直接通过类名这种语法形式获取一个类的Class实例对象

Class.forName(String className):过类的全限定名获取Class实例对象,需要处理ClassNotFoundException异常。

这些方式均可以获得一个Java类的Class实例对象,从而可以利用反射机制获取该类的一系列信息,如属性、方法、构造方法、注解等。

1)类名.Class

在开始示例的前期准备工作我们写一个类(Class)

package com.tgq.reflect;public class Student {private String sid;private String sname;public Integer age;static {System.out.println("加载进jvm中!");}public Student() {super();System.out.println("调用无参构造方法创建了一个学生对象");}public Student(String sid) {super();this.sid = sid;System.out.println("调用带一个参数的构造方法创建了一个学生对象");}public Student(String sid, String sname) {super();this.sid = sid;this.sname = sname;System.out.println("调用带二个参数的构造方法创建了一个学生对象");}@SuppressWarnings("unused")private Student(Integer age) {System.out.println("调用Student类私有的构造方法创建一个学生对象");this.age = age;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public void hello() {System.out.println("你好!我是" + this.sname);}public void hello(String name) {System.out.println(name + "你好!我是" + this.sname);}@SuppressWarnings("unused")private Integer add(Integer a, Integer b) {return new Integer(a.intValue() + b.intValue());}}

编写好一个类之后我们开始调用方法进行拿去:代码示例

package com.tgq.reflect;public class Demo_01 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 1、类名.ClassClass c1 = Student.class;System.out.println(c1);}}

输出结果:

2)对象.getClass()

package com.tgq.reflect;public class Demo_01 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 1、类名.Class// Class c1 = Student.class;// System.out.println(c1);// 2、对象.getClass();Student student = new Student();Class c2 = student.getClass();System.out.println(c2);}}

输出结果:

3)Class.forName()

package com.tgq.reflect;public class Demo_01 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 1、类名.Class// Class c1 = Student.class;// System.out.println(c1);// 2、对象.getClass();// Student student = new Student();// Class c2 = student.getClass();// System.out.println(c2);// 3、Class.forName();Class c3 = Class.forName("com.tgq.reflect.Student");System.out.println(c3);}}

输出结果:

三、反射实例化

在Java中,可以使用反射来实例化一个类。具体实现可以通过Class类的newInstance()方法或者Constructor类的newInstance()方法来实现。

三个常用的方法:getConstructor ()getDeclaredConstructor () ,newInstance()

一切的反射从类类开始

1、调用一个公有的无参构造方法

public class Demo_02 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 一切反射从类类开始// 不管是哪一种获取类类的方法都是可以的// Class c1 = Class.forName("com.tgq.reflect.Student");// Student student = new Student();// Class c1 = student.getClass();Class c1 = Student.class;Student stu1 = (Student) c1.newInstance();System.out.println(stu1);}}

输出结果:

2、调用一个公有的一个参构造方法

public class Demo_02 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 一切反射从类类开始// 不管是哪一种获取类类的方法都是可以的// Class c1 = Class.forName("com.tgq.reflect.Student");// Student student = new Student();// Class c1 = student.getClass();Class c1 = Student.class;Student stu1 = (Student) c1.newInstance();System.out.println(stu1);Constructor con1 = c1.getConstructor(String.class);Student stu2 = (Student) con1.newInstance("s1");System.out.println(stu2);}}

输出结果:

3、调用一个公有的两个参构造方法

public class Demo_02 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 一切反射从类类开始// 不管是哪一种获取类类的方法都是可以的// Class c1 = Class.forName("com.tgq.reflect.Student");// Student student = new Student();// Class c1 = student.getClass();Class c1 = Student.class;Student stu1 = (Student) c1.newInstance();System.out.println(stu1);Constructor con1 = c1.getConstructor(String.class);Student stu2 = (Student) con1.newInstance("s1");System.out.println(stu2);Constructor con2 = c1.getConstructor(String.class, String.class);Student stu3 = (Student) con2.newInstance("s1", "sb");System.out.println(stu3);}}

输出结果:

4、调用一个私有的一个参构造方法

public class Demo_02 {@SuppressWarnings("rawtypes")public static void main(String[] args) throws Exception {// 一切反射从类类开始// 不管是哪一种获取类类的方法都是可以的// Class c1 = Class.forName("com.tgq.reflect.Student");// Student student = new Student();// Class c1 = student.getClass();Class c1 = Student.class;Student stu1 = (Student) c1.newInstance();System.out.println(stu1);Constructor con1 = c1.getConstructor(String.class);Student stu2 = (Student) con1.newInstance("s1");System.out.println(stu2);Constructor con2 = c1.getConstructor(String.class, String.class);Student stu3 = (Student) con2.newInstance("s1", "sb");System.out.println(stu3);Constructor con3 = c1.getDeclaredConstructor(Integer.class);// 打开私有的访问权限con3.setAccessible(true);Student stu4 = (Student) con3.newInstance(1);System.out.println(stu4);}}

输出结果:

四、反射:方法调用

1、公有无参

public class Demo_03 {public static void main(String[] args) throws Exception {Class c = Student.class;// 1、反射调用 无参方法Student s = (Student) c.newInstance();// 反射调用无参方法,先获取到方法对象// name:方法名// parameterTypes:调用这个方法要传的参数类型Method m1 = c.getMethod("hello");// invoke:方法的返回值// obj:类示例// args:参数值Object invoke = m1.invoke(s);System.out.println(invoke);}}

输出结果:

2、公有有参

public class Demo_03 {public static void main(String[] args) throws Exception {Class c = Student.class;// 1、反射调用 无参方法Student s = (Student) c.newInstance();// 反射调用无参方法,先获取到方法对象// name:方法名// parameterTypes:调用这个方法要传的参数类型Method m1 = c.getMethod("hello");// invoke:方法的返回值// obj:类示例// args:参数值Object invoke = m1.invoke(s);System.out.println(invoke);// 2、调用有参方法Method m2 = c.getMethod("hello", String.class);Object invoke2 = m2.invoke(s, "asdfghjk");System.out.println(invoke2);}}

输出结果:

3、私有有参

public class Demo_03 {public static void main(String[] args) throws Exception {Class c = Student.class;// 1、反射调用 无参方法Student s = (Student) c.newInstance();// 反射调用无参方法,先获取到方法对象// name:方法名// parameterTypes:调用这个方法要传的参数类型Method m1 = c.getMethod("hello");// invoke:方法的返回值// obj:类示例// args:参数值Object invoke = m1.invoke(s);System.out.println(invoke);// 2、调用有参方法Method m2 = c.getMethod("hello", String.class);Object invoke2 = m2.invoke(s, "asdfghjk");System.out.println(invoke2);// 3、调用有参私有的方法Method m3 = c.getDeclaredMethod("add", Integer.class, Integer.class);// 打开私有权限m3.setAccessible(true);Object invoke3 = m3.invoke(s, 1, 2);System.out.println(invoke3);}}

输出结果:

完整代码:

package com.tgq.reflect;import java.lang.reflect.Method;public class Demo_03 {public static void main(String[] args) throws Exception {Class c = Student.class;// 1、反射调用 无参方法Student s = (Student) c.newInstance();// 反射调用无参方法,先获取到方法对象// name:方法名// parameterTypes:调用这个方法要传的参数类型Method m1 = c.getMethod("hello");// invoke:方法的返回值// obj:类示例// args:参数值Object invoke = m1.invoke(s);System.out.println(invoke);// 2、调用有参方法Method m2 = c.getMethod("hello", String.class);Object invoke2 = m2.invoke(s, "asdfghjk");System.out.println(invoke2);// 3、调用有参私有的方法Method m3 = c.getDeclaredMethod("add", Integer.class, Integer.class);// 打开私有权限m3.setAccessible(true);Object invoke3 = m3.invoke(s, 1, 2);System.out.println(invoke3);}}

五、反射:读写属性

通过Field类的get()set()方法来实现。

拿到我们所有的属性:

public class Demo_04 {public static void main(String[] args) throws Exception {Class c = Student.class;Student stu = new Student("1", "1A");// 我们把age设置一个值stu.age = 18;// System.out.println(stu.getSid());// 获取对象中全部的属性Field[] fields = c.getDeclaredFields();// 遍历for (Field f : fields) {// 因为sid、sname是私有的,所以我们要打开私有权限f.setAccessible(true);// 获取所有属性System.out.println(f.getName() + ":" + f.get(stu));}}}

输出结果:

我们进行设置属性值:

public class Demo_04 {public static void main(String[] args) throws Exception {Class c = Student.class;Student stu = new Student("1", "1A");// 我们把age设置一个值stu.age = 18;// System.out.println(stu.getSid());// 拿到属性Field snamefield = c.getDeclaredField("sname");// 打开权限snamefield.setAccessible(true);// 进行设置snamefield.set(stu, "2B");// 获取对象中全部的属性Field[] fields = c.getDeclaredFields();// 遍历for (Field f : fields) {// 因为sid、sname是私有的,所以我们要打开私有权限f.setAccessible(true);// 获取所有属性System.out.println(f.getName() + ":" + f.get(stu));}}}

输出结果:

完整代码:

package com.tgq.reflect;import java.lang.reflect.Field;public class Demo_04 {public static void main(String[] args) throws Exception {Class c = Student.class;Student stu = new Student("1", "1A");// 我们把age设置一个值stu.age = 18;// System.out.println(stu.getSid());// 拿到属性Field snamefield = c.getDeclaredField("sname");// 打开权限snamefield.setAccessible(true);// 进行设置snamefield.set(stu, "2B");// 获取对象中全部的属性Field[] fields = c.getDeclaredFields();// 遍历for (Field f : fields) {// 因为sid、sname是私有的,所以我们要打开私有权限f.setAccessible(true);// 获取所有属性System.out.println(f.getName() + ":" + f.get(stu));}}}

来源地址:https://blog.csdn.net/weixin_74383330/article/details/131338994

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java重点:反射机制的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Java反射机制

这篇文章主要介绍“如何使用Java反射机制”,在日常操作中,相信很多人在如何使用Java反射机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java反射机制”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-15

Java反射机制怎么使用

今天小编给大家分享一下Java反射机制怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。反射的概述JAVA反射机制是在运
2023-06-30

Java反射机制有哪些特点

Java反射机制有以下特点:1. 动态性:反射机制允许在运行时动态地获取类的信息,实例化对象和调用类的方法,而不需要在编译时确定类的类型。2. 类型检查:反射机制提供了一些方法用于检查类的成员变量和方法的类型,以便在运行时进行类型检查。3.
2023-10-07

java反射机制有哪些优缺点

Java反射机制具有以下优点:1. 动态性:反射允许在运行时获取类的信息并访问和操作类的成员,使得程序具有更高的灵活性和动态性。2. 可扩展性:反射机制允许在运行时动态添加新的类和对象,并在不修改源代码的情况下使用它们。3. 适应性:反射机
2023-09-07

Java反射机制怎么应用

本篇内容主要讲解“Java反射机制怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制怎么应用”吧!反射基础p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没
2023-06-17

Java反射的概念和机制

这篇文章主要讲解了“Java反射的概念和机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射的概念和机制”吧!1. 什么是反射?什么是反射?在官方文档中是这样说的:Reflecti
2023-06-02

java中的反射机制怎么应用

Java中的反射机制可以应用于以下场景:动态加载类:可以在运行时加载指定的类,而不是在编译时就确定类的类型。创建对象:可以通过反射机制动态创建对象,而不是使用new关键字。调用方法:可以通过反射机制动态调用对象的方法,包括私有方法。访问属性
2023-10-23

java中反射机制的使用场景有哪些

这期内容当中小编将会给大家带来有关java中反射机制的使用场景有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式
2023-06-14

java反射机制的作用有哪些

Java反射机制的作用有以下几个:1. 动态加载类:可以在运行时动态加载一个类,不需要在编译时确定类的全名。2. 动态创建对象:可以在运行时动态创建一个对象,而不需要在编译时确定对象的类型。3. 动态调用方法:可以在运行时动态调用一个类的方
2023-10-08

Golang反射机制怎么使用

本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍反射的本质就是在程序运行的时候,获
2023-06-30

java反射机制有什么作用

本篇内容介绍了“java反射机制有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本教程操作环境:windows7系统、java10版
2023-06-30

Java中反射机制有什么用

这篇文章主要为大家展示了“Java中反射机制有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中反射机制有什么用”这篇文章吧。反射:可以动态的获取指定类中的成员,以及建立类对象。好处
2023-06-17

java中反射机制的作用有哪些

本篇文章为大家展示了java中反射机制的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象
2023-06-06

Java反射机制的原理介绍

这篇文章主要介绍“Java反射机制的原理介绍”,在日常操作中,相信很多人在Java反射机制的原理介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java反射机制的原理介绍”的疑惑有所帮助!接下来,请跟着小编
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录