Java的反射机制

vivado Block Design 设计 .tcl 文件使用,导出,修改,添加方式 在vivado中生成 Block Design可以导出tcl文件进行保存(体积小),或者在别的版本vivado中打开(版本互通),这是一个非常好的功能。另外GitHub中很多项目都是采用这种方式上传的,学会如何使用可以快速修改历程项目。 阅读详情
1.概念
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。这种在程序运行时,允许改变程序结构和变量类型的语言称之为动态语言。
通俗点说:这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
java的运行需要经历:java源程序(.java文件)----java编译器(.class文件)——java解释器(机器代码)——真正的执行
2.反射机制的作用:
1)反编译(反编译概念:计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。)
2)通过反射机制访问java对象的属性,方法,构造方法等,动态的改变程序的结果或者变量的类型等;
3.JDK中提供的Reflection API提供的关于反射的类主要有:
java.lang.Class;                
java.lang.reflect.Constructor; 构造方法反射类
java.lang.reflect.Field;    属性反射类    
java.lang.reflect.Method; 方法反射类
java.lang.reflect.Modifier; 修饰符反射类
反射中的方法,属性等操作可以从这四个类中查询(这些类都重写了toString方法)
4.反射的具体使用
<1>反射机制获取类(即获取类的Class对象。Class 类的实例表示正在运行的 Java 应用程序中的类或者接口。获取类的Class对象有多种方式:)的三种方法:
Class 类的实例表示正在运行的 Java 应用程序中的类或者接口。获取类的Class对象有三种方式:
调用getClass Boolean var1 = true;
Class<?> classType2 = var1.getClass();
System.out.println(classType2);
输出:class java.lang.Boolean
运用.class 语法 Class<?> classType4 = Boolean.class;
System.out.println(classType4);
输出:class java.lang.Boolean
运用static method Class.forName() Class<?> classType5 = Class.forName("java.lang.Boolean");
System.out.println(classType5);
输出:class java.lang.Boolean


 如下三种实验:
package demo;
public class GetClassDemo {
public static void main(String[] args) {
/*
* 利用反射获取类的三种方法
*/
try {
//1.第一种方法:Class.forName("包名+类名类的完整路径");
Class type_1 =Class.forName("demo.Person");
if (type_1!=null) {
System.out.println(type_1.toString());
}else {
System.out.println("1位空");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//第二种方法 类的对象.getClass()来获取该类的类对象
Person person =new Person();
Class type_2 =person.getClass();
System.out.println(type_2+"--->2");
//第三种方法 类.class获取该类的类对象
Class type_3 =Person.class;
System.out.println(type_3+"----->3");
}
}
运行结果:
class demo.Person
class demo.Person--->2
class demo.Person----->3
<2>获取类对象之后创建原始类的对象
依旧接着上面的程序:
Object object =type_2.newInstance(); 且object instanceof Person ==true
也就是 object可以强制转换为Person类型
<3>获取属性
分为获取所有属性和指定属性
获取 所有属性:
//获取类中的所有属性
Field [] fields =class1.getFields();
for(Field f:fields)
{
StringBuilder builder =new StringBuilder();
int a = f.getModifiers();//获取属性的修饰符号不知为何这里竟然是int类型,待会考究
String typeNameString =f.getType().getSimpleName();//获取属性的类型的名字
String name = f.getName();//获取属性的名字
builder.append(typeNameString+" "+name);
System.out.println(builder);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//输出结果为: int min_value
int max_value
Class type
int size
int bytes
获取特定的属性(程序承接上面)
try {
//获取类中特定name属性
Field feild_name =type_2.getDeclaredField("name");
//实例化这个类
Object object =type_2.newInstance();
//打破封装 原来的时候类中属性name为private修饰
//不能被其他类访问 反射中为name赋值必须打破封装
//不利之处:导致java对象的属性不安全
feild_name.setAccessible(true);
//给原始类对象object的属性name赋值
feild_name.set(object, "张晓华");
//也可以从中取出来值
System.out.println(feild_name.get(object));
/*
* 注解上面:原来在源码中都是【对象.setXXX(值)】给类的实例赋值
* 【对象.getXXX()从类的对象中取值】,在反射中使用XXX.set(对象,值)给XXX本身赋值
* XXX.get(对象)获取XXX本身的值
*/
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
<4>、获取类的Method
通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法
Class<T>类提供了几个方法获取类的方法。
public MethodgetMethod(String name,Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
public Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
public MethodgetDeclaredMethod(Stringname,Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
<5>获取类的Constructor
通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 
Class<T>类提供了几个方法获取类的构造器。
public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法
public Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法
public Constructor<?>[] getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法
//获取构造器的两种方法
// 1.使用getConstructors获取构造器
Constructor<?>[] constructors = type_2.getConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i]);
}
//2.使用getDeclaredConstructor()获取构造器 type_2.getDeclaredConstructors();
//创建类的实例的3种方法
/* 第一种方法.调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败. */
Class person_class =Person.class;
Object object = person_class.newInstance();
/* 第二种方法.调用默认Constructor对象的newInstance方法 */
Constructor<?> constructor = person_class.getConstructor();
Object object2 = constructor.newInstance();
/* 第二种方法调用Constructor对象的newInstance方法*/
Constructor<?> constructor2 =
person_class.getDeclaredConstructor(int.class, String.class);
Object object3 = constructor2.newInstance(1, "123");
}
<6>新建类的实例
通过反射机制创建新类的实例,有几种方法可以创建
调用无自变量ctor 1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.
Class<?> classType = ExtendType.class;
Object inst = classType.newInstance();
System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Default Constructor
com.quincy.ExtendType@d80be3

2、调用默认Constructor对象的newInstance方法
Class<?> classType = ExtendType.class;
Constructor<?> constructor1 = classType.getConstructor();
Object inst = constructor1.newInstance();
System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Default Constructor
com.quincy.ExtendType@1006d75
调用带参数ctor 3、调用带参数Constructor对象的newInstance方法
Constructor<?> constructor2 =
classType.getDeclaredConstructor(int.class, String.class);
Object inst = constructor2.newInstance(1, "123");
System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Constructor with parameters
com.quincy.ExtendType@15e83f9
 
<7>调用类的函数
通过反射获取类Method对象,调用Field的Invoke方法调用函数。
//获取所有方法
Method[] ms = type_2.getDeclaredMethods();
Object object3 = type_2.newInstance();
for(Method m:ms)
{
System.out.println(m);
//根据不同的方法中存在的参数执行不同的调用 这里除了无参的就是有一个String类型参数的因此这样简单判断 否则得进行严格逻辑判断
Parameter []ps = m.getParameters();
if(ps.length>0&&ps!=null)
{
//利用invoke调用方法
m.invoke(object3,"张三");
}
对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

Ubuntu24.04LTS上Ollama GPU加速配置指南:从驱动安装到多卡均衡负载 本文详细介绍了在Ubuntu24.04LTS系统上配置Ollama GPU加速的完整指南,包括NVIDIA驱动安装、CUDA Toolkit配置、Ollama在线与离线安装方法,以及多GPU负载均衡优化策略。通过实战案例和性能调优建议,帮助开发者充分利用硬件资源提升大型语言模型的运行效率。 阅读详情

相关推荐

Altium Designer 16来自原理图/PCB的各种报错 (持续更新):

NO1.Nets with only one pin: 根本原因: 在BGA的原理图绘制时,我一般习惯拉出该元件的所有IO的网络,这方便利于我开发其他款板卡。同样也会因为不同板卡的需求不同而造成有些IO并没有使用到,也就是整个原理图中only one pin。 解决方案: 鼠标右键工程文件>工程参数>下图圈中的选项将“错误”更改为“警告/不报告” ...

优快云@猿谷攻城狮 1万+

类加载机制与反射5——使用反射生成JDK动态代理

        在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。使用Proxy和InvocationHandler创建动态代理动态代理和AOP1.使用Proxy和InvocationHandler创建动态代理        Proxy提供了用于创建动态代理类和代理对象的...

小特 356

告别Colmap!在ROS2 Humble上,用Fast-LIVO2直接为3D Gaussian Splatting准备数据全流程

本文详细介绍了在ROS2 Humble环境下,使用Fast-LIVO2为3D Gaussian Splatting(3DGS)准备数据的全流程。通过优化Fast-LIVO2配置、实时数据同步机制和3DGS训练参数,显著提升了三维重建效率和质量,相比传统Colmap流程节省95%以上的预处理时间。适用于Ubuntu22.04系统,适合机器人及自动驾驶领域的三维重建应用。

weixin_28688385的博客 589

java 反向映射机制_Java的反射机制之反向抽烟

show me the code and take to me,做的出来更要说的明白GitHub项目JavaHouse同步收录喜欢就点个赞呗! 你的支持是我分享的动力!引入反射是一种不按套路处出牌的机制。通常我们接触的方式都是 "正射",暂且起这个名字。虽然我们用的少,但是反射其实就在我们日常开发中。比如我们常见的空指针异常,或者是 Spring 的各种注解配置创建对象等等。正常操作Reflec...

weixin_26820427的博客 230

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 483

【视线追踪】视线追踪的性能评估框架 及 基础知识

文章目录一、 前言二、 眼球追踪基础1. 眼动类型研究2. 基本设备3. 校准 calibration4. 眼球视线和头部姿态的关系5. 视线追踪精确度的评估三、 视线估计算法1. 基于2维回归2. 基于3D模型1) 单摄像头2) 多摄像头3. 基于交叉比4. 基于外观5. 基于眼睛形状的方法四、 实现估计的应用1. 电脑2. 电视3. 头戴设备4. 汽车5. 手持设备6. 设备配置五、 视线追踪的性能指标和错误原因1. 不同平台之间差异性很大2. 影响视线追踪可用性的因素六、 视线追踪系统的性能评估框架1

火火的博客 5317

深入理解Java反射(通俗易懂)

反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象...

Mr.zhao 5275

完整的 Python 数据分析案例:新能源汽车续航里程预测

随着新能源汽车的普及,续航里程成为消费者关注的重要指标。准确预测新能源汽车的续航里程,有助于车企优化电池管理系统、提升车辆性能,也能帮助消费者合理规划出行。本案例将基于新能源汽车的各项参数,如电池容量、行驶速度、环境温度等,构建续航里程预测模型。通过以上改进,可以提高数据处理的准确性、模型的性能和可视化的效果。

daqsdfas的博客 1588

JAVA反射机制的学习

转载:http://www.iteye.com/topic/136205   JAVA语言中的反射机制:     在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法?     对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAVA的反射。从而使java具有动态语言的特性。 JAVA反射机制主要提供了以下功能: 1...

333 173

DMA engine initialization failed rk3568的原因及解决方案

刚开始调试 switch 芯片的时候由于rgmii 时钟是output , rk3568的 GMAC 需要 switch 芯片提供 125M的时钟,如果没有这个时钟就会初始化失败,进入文件系统后 ethx 不会出现(当然,如果屏蔽掉这里ethx 会出现,但是引发更多的问题,笔者在这块耍小聪明,导致耗费了近一个月时间,把网络这块整个查了一遍 -----)dma 软复位是在进入文件系统后,网络系统启动的时候,我想如果在这个之前只要提供合适的时钟那么就是可以的,那么------以上是官方的文档说明。

Nyiragongo的博客 4575

uniapp+renderJS+google map开发安卓版APP非小程序

uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示

renkai721的专栏 667

Java反射机制

Java反射机制           众所周知Java有个Object class,是所有Java classes的继承根源,其内声明了数个应该在所有Java class中被改写的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object。           Class ...

净心斋 172

YOLO11改进|卷积篇|引入多样化分支块DBB

YOLO11中添加多样化分支块DBB

A1983Z的博客 1449

java的反射机制浅谈

一、java的反射机制浅谈最近研究java研究得很给力,主要以看博文为学习方式。以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出。受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦!1.何谓反射机制根据网文,java中的反射机制可以如此定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2.反射机制如何实现谈到反射机

Winiex's Blog 12万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java 反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。     Class 类与java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了Field,Method,Constructor类(每个类都实现了Member

点滴记录 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java中的反射机制

在我的上篇文章模拟JDK动态代理实现中涉及到了反射机制,学无止境,在此系统的学习一下Java中的反射机制。首先给出Java反射机制的定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 从以上的描述中可以看出Java中的动态特性,那么

yhao的博客 9072

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 反射机制介绍

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制在框架设计中极为广泛,需要深入理解 反射基础 RRIT(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定

vincent_wen0766的博客 785

JAVA反射机制总结

JAVA反射机制总结JAVA反射机制总结 反射的概述 什么是反射 为什么用反射机制 反射机制的关键 获取Class对象 获得构造器的方法 获得属性的方法 获得方法信息的方法 关于getMethods和getDeclaredMethods的区别 反射总结 巨人的肩膀反射的概述什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改他状态或行为的一种能力。 JAVA

Bing_ka的专栏 2101

什么是java反射机制

1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2反射机制能做什么 反射机制主要提供了以下功能:  在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所...

陈旭媛 1299

Java-反射机制(超详解)_java反射机制

新星计划,等你来造,一起学习进步!点击跳转活动奖励:❀【新秀奖】新注册用户发布第一篇文章(500字以上)获得电子【新秀勋章】;❀【基础奖】完成任务挑战用户可获专属电子勋章(潜力新星)+抽奖机会(百分百中奖)❀【特别奖】各导师评选团队综合top5,获实力新星实体证书/实体奖牌红色款二选一+APP作者推荐关注+实力(1)Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。

2501_90250883的博客 1445

对Java中反射机制的理解

简单的说,反射机制就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查,进行装载,还可以获取类本身,类的所有成员变量和方法,类的对象,还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法,这就是反射机制一个比较重要的功能了。那么要通过程序来理解反射机制,首先要理解类的加载过程。 在Java程序执行的时候,要经历三个步骤:加载、连接和初始化。首先程序要加载到JVM的方法区中,然...

小Gd 的博客 1万+
上一篇: Android的UI简要汇总,后期再更新
下一篇: java中的注解(转载)
夕夕如盼
博客等级 码龄12年 28粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值