反射-基本了解(Class类)

Class类与java反射 通过java反射机制,实现访问、检测和修改描述Java对象本身信息的功能。java反射机制的功能十分强大,在java.lang.reflect包中提供了对该功能的支持。 阅读详情

Use类

public class User {

    private String name;

    private double height;

    private Date birthday;

    public User(String name, double height, Date birthday) {
        this.name = name;
        this.height = height;
        this.birthday = birthday;
    }

    public User() {

    }

    public String getName() {
        return name;
    }

    public double getHeight() {
        return height;
    }

    public Date getBirthday() {
        return (Date) birthday.clone();
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Double.compare(user.height, height) == 0 &&
                name.equals(user.name) &&
                birthday.equals(user.birthday);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, height, birthday);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", height=" + height +
                ", birthday=" + new SimpleDateFormat("yyyy-MM-dd").format(birthday) +
                '}';
    }
}

首先介绍三种 获取类对象的方法

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")//日期格式化对象
User tom = new User("Tom Galas",178.6,sdf.parse("1997-08-24"));
Class aClass = tom.getClass();//根据实例获取类对象
aClass = User.class;//根据类获取类对象
aClass = Class.forName("reflection.User");//根据类名(全限定名)获取类对象

特别注意:根据类名获取类对象 一定要使用全限定名,否则报

java.lang.ClassNotFoundException: User

获取到类之后我们就可以获取到类中的全部东西了。
首先来获取属性

Field[] allFields = aClass.getDeclaredFields();//可以获取包括private修饰的全部属性
Field[] publicFields = aClass.getFields();//只能获取public修饰的属性
for (Field field : allFields) {
 //getType是获取属性的类型                     getName是获取属性的变量名
	System.out.println(field.getType() + "-->" + field.getName());
}
System.out.println("========================");
for (Field field : publicFields) {
	System.out.println(field.getType() + "-->" + field.getName());
}

因为User类中的所有属性都是private修饰的,所以毫无疑问publicFields数组是空的
输出结果如下:

class java.lang.String–>name
double–>height
class java.util.Date–>birthday
========================

不单单是属性的类型和属性名,甚至连属性的修饰符都能够获取到

Field[] allFields = aClass.getDeclaredFields();//可以获取包括private修饰的全部属性

for (Field field : allFields) {
	//getType是获取属性的类型                     getName是获取属性的变量名
	System.out.println(field.getModifiers() + "-->" + field.getType() + "-->" + field.getName());
            }

运行结果:

2–>class java.lang.String–>name
2–>double–>height
2–>class java.util.Date–>birthday

会显示2,这是在Modifier类中规定的
下面抽取Modifier中一小段代码展示

 /**
     * The {@code int} value representing the {@code public}
     * modifier.
     */
    public static final int PUBLIC           = 0x00000001;

    /**
     * The {@code int} value representing the {@code private}
     * modifier.
     */
    public static final int PRIVATE          = 0x00000002;

    /**
     * The {@code int} value representing the {@code protected}
     * modifier.
     */
    public static final int PROTECTED        = 0x00000004;

    /**
     * The {@code int} value representing the {@code static}
     * modifier.
     */
    public static final int STATIC           = 0x00000008;

    /**
     * The {@code int} value representing the {@code final}
     * modifier.
     */
    public static final int FINAL            = 0x00000010;
    ......

可以看出在源码中使用16进制来代表不同的修饰符的。
private是2。

我们要深知一点,在java中,一切都是对象。所以我们在Class中获取到的属性,方法等,他们也都是对象,在他们其中有编写好的操作他们的方法。

Constructor[] declaredConstructors = aClass.getDeclaredConstructors();//获取全部构造器
Annotation[] declaredAnnotations = aClass.getDeclaredAnnotations();//获取类上的全部注解(不是类中)
Method[] declaredMethods = aClass.getDeclaredMethods();//获取全部方法

还有许多方法可以前往Class类中查看。你会有很大收获。
许多方法的使用都大差不差。

在这里特别注意的是在Method中有个invoke方法

Method getName = aClass.getMethod("getName");//根据方法名获取方法对象
getName.invoke(tom);//调用tom实例中的getName方法,这里因为,getName没有参数,所以不需要传任何东西,如果有参数,则在tom后依次传入,使用标点隔开,如invoke(tom,1,2,3,..)

这里的getName方法不是static修饰的,所以需要传入User对象的一个实例,如果该方法是static修饰的,那么invoke的第一个参数直接传入null(注意是传入null,而不是不传)

Python实战:从中国气象局天擎平台自动化获取与处理雷达基数据 本文详细介绍了如何利用Python脚本实现从中国气象局天擎平台自动化获取与处理雷达基数据。通过环境搭建、安全认证、核心代码编写及工程化优化,构建了一个包含自动查询、批量下载、错误重试和格式转换的完整数据管道,旨在帮助气象水文领域的研究者与数据分析师从繁琐的手动操作中解放出来,高效管理海量数据。 阅读详情

相关推荐

ddr3ip核心_DDR3 IP 核配置

DDR3 控制器 IP 核2.DDR3 IP核配置点击 Flow Navigator 面板下的“Project Manager -->IP Catalog”。 在“Memories & Storage Elements -->Memory Interface Generators”分类展开后,可以看到名为“Memory Interface Generator (MIG 7 ...

weixin_33049919的博客 2935

JavaSE进阶 | 反射机制(反射Class),通过反射机制创建对象

JavaSE | 反射机制(反射Class):通过反射机制创建对象

m0_61933976的博客 2310

从零到一:3D Slicer与MONAI在医学影像中的AI革命

本文探讨了3D Slicer与MONAI在医学影像分析中的革命性应用,展示了如何通过开源工具实现高效的三维影像处理和AI增强分析。结合临床案例,详细介绍了从数据准备到AI分析的全流程,显著提升诊断效率和精度,推动医学影像技术迈向新纪元。

tcp8optimizer的博客 339

关于Java反射中基本类型的class问题

[size=medium]1. 基本类型的class和其对应包装类的class是不同的,所以在获得Method指定参数的时候,需要精确指定参数的类型,即 setInt(int x) [b]无法[/b]使用 getMethod("setInt",Integer.class) 获得。 2. 基本类型的class无法通过Class.forName方法获得,可以通过 [b]类型名.class[/b]...

lowZoom 574

从RTL到GDSII:DC综合里那些没人告诉你的时钟约束冷知识(附真实工程示例)

本文深入探讨数字IC设计中DC综合阶段的时钟约束冷知识,包括无毛刺时钟切换、寄存器分频时钟约束、虚拟时钟应用等关键技巧。通过真实工程示例,揭示常见约束误区及解决方案,帮助工程师提升时序收敛效率。特别针对input_delay和output_delay在多时钟域场景下的设置陷阱提供实用指南。

weixin_29306317的博客 429

PCB工程师必看:别再搞错1078玻纤布的Dk了,手把手教你算等效介电常数

本文为PCB工程师提供了1078玻纤布等效介电常数(Dk)的详细计算指南,帮助解决高速设计中的信号完整性问题。通过解析玻纤布结构、混合介质理论和实战计算方法,指导工程师准确设置EDA工具参数,避免常见的Dk计算误区,提升设计精度和仿真准确性。

weixin_42546392的博客 398

反射(二)- Class类

一、基本介绍 1. Class 也是类,继承 Object 类 2. Class 类对象不是new 出来的,而是系统创建的 3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次 4. 每个类的实例都会记得自己是由哪个 Class 实例所生成 5. 通过 Class 对象可以完整地得到一个类的完整结构,通过一系列 API 6. Class 对象是存放在堆的 7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,...

yirenyuan的博客 477

CSV文件输入到simulink中

将示波器波形和数据CSV文件保存下来进行数据分析。将波形绘制到simulink中

yay0923的博客 5325

反射的基本原理与使用(带例题)

标题反射的基本原理 『反射』就是指程序在运行时能够动态的获取到一个类的类型信息的一种操作。它是现代框架的灵魂,几尽所有的框架能够提供的一些自动化机制都是靠反射实现的,这也是为什么各类框架都不允许你覆盖掉默认的无参构造器的原因,因为框架需要以反射机制利用无参构造器创建实例。 总的来说,『反射』是很值得大家花时间学习的,尽管大部分人都很少有机会去手写框架,但是这将有助于你对于各类框架的理解。不奢求你通过本篇文章的学习对于『反射』能够有多么深层次的理解,但至少保证你了解『反射』的基本原理及使用。 标题Class

weixin_47062406的博客 934

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 225

Label Studio + SAM2分割半自动标注与yolo11训练

Label Studio + SAM2分割半自动标注与yolo11训练

schFallingCloud 1408

java反射什麽意思_JAVA反射是什么呢?

1、一个类,相当于一个对象的“模子”,这个“模子”也占内存,故也能用变量来“引用”(引用:即,变量名--内存起址对应表)2、类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会加载此类:一个类的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。(1)加载:就是将class文件读入内存,并为之创建一个Class对象,任何类被使用时系统都会建立一个Class对象连接...

weixin_39996141的博客 199

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1926

深入研究java.lang.Class类

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。       Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载

胡汉三 1905

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA Class类

Java中Class类及用法 http://www.cnblogs.com/bethunebtj/p/4680532.html

q2997963592的博客 219

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java反射总结_java反射总结

Class类的使用1)在面向对象的世界里,万事万物皆对象java语言中,静态的成员、普通数据类型不是对象1.1 类是谁的对象呢?类是对象,类是java.lang.Class类的实例对象1.2 这个对象到底如何表示? There is a class named Classpublic class ClassDemo1 {public static void main(String[] args) ...

weixin_31849265的博客 133

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

17、反射

反射 一、反射 1. 类的对象:基于一个已经定义好的类创建出来的对象称之为类的对象 2. 类对象:类加载的产物。 类加载:JVM在第一次使用某一个类的时候会通过CLASSPATH找到编 译之后生成的.class文件,然后将类中所有的信息(类名,属 性,方法,构造方法,包结构,父类,接口…)保存在内存中. 类加载只会进行一次。 ​ 3. Class类 所有类对象的共性,位于java.lang包下...

weixin_45536396的博客 180

反射 — Java 架构师开发必须懂的

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Class类的构造方法...

weixin_34220834的博客 85

Java高级 - 反射

目录一、Class类的使用二、java 动态加载类未完待续 一、Class类的使用 1)在面向对象的世界里,万事万物皆对象。 但是在java语言中,静态的成员、基本数据类型不是对象 类也是对象,类是java.lang.Class类的实例对象 2)认识Class类 public class ClassDemo1 { public static void main(String[] args) {...

z_z_h_0的博客 598

java中反射的基本使用方法

在java中,反射是个搞东西,可以使用一些不被公开的类函数,也是设计模式在使用过程中的重要方法,关于反射的介绍文章很多,下面结合自己的理解,总结下反射使用的步骤: 1)第一步,就是要获取你所要反射类的定义,这其实是一个Class类的实例,通过这个实例你就可以获取你要反射的类的定义,也就相当于我们在编写代码时所看到的类的结构,包括他有那些变量,那些函数,那些是公开的,那些是私有的等等,只不过这些都是

wgj99991111的博客 483

关于反射的一些知识

每一个对象在内存里面都有一个字节码,而Class就相当于每个字节码Class.forName的作用就是返回一个字节码,而这个字节码返回有两种方式:  第一就是,这个字节码曾经被加载过,已经存在java虚拟机里面直接返回  第二就是,java虚拟机里面没有这份字节码,用类加载器去加载,把加载的字节码放在java虚拟机里面得到各个字节码的方式:  第一、类名.class 如:System.class     第二、对象.getClass() 如:new Date().getClass()  第三、Class.f

java程序猿 393

Java中Class类和反射机制

一般用来解决Java 程序运行期间,对某个实例对象一无所知的情况下,如何调用该对象内部的方法问题Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。

2301_79561226的博客 1385

反射-Class类详解

在Java中,除了int等基本类型外,Java的其他类型全部都是class(包括interface)。Java 反射机制是 Java 语言的一个重要特性。:是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作。比如:检查语法错误。:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。

weixin_55049722的博客 1264

Reflection反射——Class类

在Java中,除了int等基本类型外,Java的其他类型全部都是class(包括interface)。例如:Java反射机制是Java语言的一个重要特性。在学习Java反射机制前,需要了解两个概念:编译器和运行期。:是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编译成class文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成了文本进行操作。比如:检查语法错误。:是把编译后的文件交给计算机执行,直到程序允许结束。

PYKE_CHEN的博客 1059

反射--class类

----------------------类加载阶段-----------------------------只在运行时 才检查报错,编译时 只检查反射的语法----运行时才会加载实际类。----class对象不是创建的-----是在有。构造器---在创建类的实例化对象时才运行。属性,方法等,静态代码---按。类加载------加载类中的。在编译时 就检查报错。

kequanrrr的博客 750

反射必杀技:深入了解Class类,让你一通百通

我们来梳理下前面的知识点:反射的关键点就是获取Class类,那系统是如何获取到Class类?是通过类加载器将.class文件通过字节数组的方式加载到JVM中,JVM将字节数组转换成Class对象。那类加载器是如何加载的呢?通过的方法从缓存中查找,直接返回缓存中不存在,通过双亲委派机制加载上面两步都失败,调用findClass()通过 IO 流从指定位置获取到 .class文件得到字节数组调用类加载器() 方法,由字节数组得到Class对象Class类的构造器是私有的,所以需要通过JVM。

qq_66627105的博客 692
上一篇: 自动装箱/拆箱
大锤997
博客等级 码龄6年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值