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

Java 反射使用大全

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java 反射使用大全

前言

好多年前自己记的关于Java反射的笔记,这么些年下来,自己用到反射的时候就看这一份就够了。
但是笔记以文件形式存放不方便,所以将其放到CSDN中,也希望能给更多小伙伴带来帮助。

Class类

Java程序中的各个Java类属于同一种事物,描述这类事物的Java类名就是Class

人 -> Person
Java类 -> Class

获取各个字节码对应的实例对象

方法一 : 类名:class

Class cls1 = Person.class;

方法二 : 对象:getClass

Class cls2 = p1.getClass();

方法三 : forName

Class cls3 = Class.forName("java.lang.String");

方法四 : getClassLoader().getClass

 Class clazz = getClassLoader().getClass("java.lang.String");

.class()、getClass()、Class.forName()、getClassLoader()的区别

.class是获取声明时的类。
getClass()是获取运行时的类。
Class.forName()是通过类名来获得类。
getClassLoader()是获得类的加载器。

若字节码曾经被加载过,已经待在Java虚拟机里面了,可以直接返回,如方法一和方法二
Java虚拟机中还没有这份字节码,则用类加载器去加载,把加载的字节码缓存到虚拟机中,以后,使用这份字节码就不需要加载了,如方法三

预定义对象

9个预定义对象,8个基本类型和void

Class class1 = boolean.class;Class class2 = int.class;//.......Class class3 = Void.class;

isPrimitive判断是否是基本类型

int.class.isPrimitive

isArray判断是否是数组

int[].class.isArray

获得类型

getclass().getName();

反射

反射就是把Java类中的各种成分映射成相应的Java

Field:成员变量
Method:方法
Constructor:构造方法
Package:包

Constructor

得到某个类所有的构造方法
Class.forName("java.lang.String").getConstructors();
得到某一个构造方法

根据getConstructor中的参数返回相应的构造方法

Class.forName("java.lang.String").getConstructor(StringBuffer.class);
Constructor可以干什么

获取实例对象(一个constructor可以new出很无数个实例对象)

(强制转换)constructor1.newInstance(参数要和getConstructor中的一致);

通过默认构造方法创建实例(内部会缓存实例,第二次获取就不会再创建,直接获取)

String obj = (String) Class.frName("java.lang.String").newInstance();

原版反射的步骤是 Class -> Constructor -> newInstanceClass.newInstance()直接在内部Constructor,即直接Class -> Class.newInstance()即可获得默认构造方法的实例

Field

代表某个类中的一个成员变量

Person类

public class Person {    public String name;    private int age;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

通过反射获取成员变量

Person person = new Person();person.setAge(20);person.name = "Heiko";//Field fieldName = person.getClass().getField("name"); 都可以Field fieldName = Class.forName("reflectTest.Person").getField("name");//fieldName的值为多少?不是Heiko,因为fieldName不是对象身上的变量,而是类上,要通过field.get("实例")或getDeclaredField来获取该实例上的值String name = (String) fieldName.get(person);System.out.println("name:" + name);//对于私有变量,需暴力破解Field fieldAge = person.getClass().getDeclaredField("age"); //getDeclaredField 不管是私有还是public的,都可以获取fieldAge.setAccessible(true); //设置可以访问 fieldAge.get("age")int age = (int) fieldAge.get(person);System.out.println("age:" + age);  

获取静态变量

Field filed = obj.getClass().getField(cmdFieldName);Integer cmdValue = (Integer) filed.get(null); //获取静态变量

获得所有的成员变量

obj.getClass().getFields();

getFields和getDeclaredFields的区别

getFields() : 只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法
getDeclaredFields() : 能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

比较成员变量类型

if(field.getType() == String.class)

设置值

field.set(obj,新的值);

将实例中的String类型的成员变量值的b都换成a

//将对象中的String类型的成员变量所有的字符b换为字符aprivate static void exchangeCharValue(Object obj) throws Exception {    Field[] fields = obj.getClass().getFields();    for(Field field : fields){//if(field.getType().equals(String.class)){         if(field.getType() == String.class){ //这里用 == 比equals更准确,字节码只有一份自己和自己比较            String oldValue = (String)field.get(obj);            String newValue = oldValue.replace('b', 'a');            field.set(obj, newValue);        }    }}

Method

代表某个类中的一个成员方法

method.invoke(owner, args)
  • owner:执行这个方法的对象,args:参数,可以这么理解:owner对象中带有参数args的method方法。
  • 返回值是Object,也既是该方法的返回值。
String s = "abc";  Method methodCharAt = String.class.getMethod("charAt", int.class);String newString =methodCharAt.invoke(s, 1);//invoke是方法身上的方法,s是执行该方法的对象(必须是实例化的对象)System.out.println(newString); 

调用静态方法

methodCharAt.invoke(null,);

反射数组

  • 若数组的维数(一维、二维等)和数组类型都相等,那么他们的字节码是同一个
  • 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
  • 基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用
  • 非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用

ArrayList.asList时int[]和String[]的差别

因为asList接收Object[]类型,但int[]不是Object[]类型,所以交给jdk1.5之后的asList(T...t)处理,将int[]作为一个对象处理

Arrays.asList(new int[]{1,2,3}); //打印内容为:[@hascode]Arrays.asList(new String[]{"1","2","3"}); //打印内容为:[1,2,3]

数组的反射应用

输出数组

private static void printObject(Object obj) {    Class clazz = obj.getClass();    if (clazz.isArray()) { //如果是数组        int len = Array.getLength(obj);        for (int i = 0; i < len; i++) {            System.out.println(Array.get(obj, i));        }    } else {        System.out.println(obj);    }}  

调用

String[] array = new String[] { "1", "2", "3" };String valueString = "test";printObject(array);printObject(valueString);

来源地址:https://blog.csdn.net/EthanCo/article/details/131121370

免责声明:

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

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

Java 反射使用大全

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

下载Word文档

猜你喜欢

Java反射如何使用

这篇文章将为大家详细讲解有关Java反射如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。反射相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的
2023-06-25

java反射应用

反射使用JAVA反应进行两个vo有相同字段名字进行子转换:@Test public void doTransTest() { A a= new A(); A.setC(111L); B b= new B();
java反射应用
2017-08-29

如何使用Java反射机制

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

Java反射机制怎么使用

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

Java反射使用的详细介绍

文章目录 反射反射基本介绍反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象 反射 反射基本介绍 反射概述: 反射认为类的每一个成份都是一个对象, 对于任何一个Class类,在"运行的时候"都可以直接得
2023-08-20

java注解和反射怎么使用

Java注解和反射是Java编程中非常重要的概念。注解是一种元数据,可以用来为Java程序提供额外的信息,而反射则允许程序在运行时动态地获取类的信息并操作类的属性和方法。使用Java注解:1. 定义注解:使用 @interface 关键字定
2023-05-29

Java基础之反射怎么使用

本篇内容介绍了“Java基础之反射怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!反射是框架设计的灵魂(使用的前提条件:必须先得到代表
2023-07-05

java 中反射简单使用示例

这篇文章将为大家详细讲解有关java 中反射简单使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。package reflect_test;public class Dog implements An
2023-06-02

java反射技术的使用场景

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

Java反射的setAccessible()方法怎么使用

本篇内容介绍了“Java反射的setAccessible()方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 什么是Java的
2023-07-02

Java反射有什么用

小编给大家分享一下Java反射有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、回顾:什么是反射?反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作
2023-06-25

Java反射应用指南:如何将Java反射用于实际开发

Java反射机制强大而灵活,可以动态地获取和修改类的信息和行为,在实际开发中有着广泛的应用。本文将详细介绍Java反射的原理、使用方法和常见的应用场景,帮助开发者更好地掌握和使用Java反射机制。
Java反射应用指南:如何将Java反射用于实际开发
2024-02-02

怎么使用java反射获取属性

要使用Java反射获取属性,可以按照以下步骤进行:1. 获取要操作的类的Class对象:```javaClass clazz = YourClass.class;```2. 获取属性:```javaField field = clazz.g
2023-09-04

java反射之invoke方法怎么使用

Java反射中的invoke方法用于调用指定对象的方法。它的使用方式如下:1. 获取Class对象:首先需要获取到要调用方法的对象的Class对象,可以使用`Class.forName()`方法或者直接使用对象的`getClass()`方法
2023-08-18

编程热搜

  • 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动态编译

目录