深入理解java中的反射机制

PPT高清导出秘籍:如何轻松设置600dpi图片分辨率 本文详细解析了PPT导出图片模糊的根本原因,并提供了通过修改Windows注册表将导出分辨率从默认的96dpi提升至600dpi的完整教程。该方法能显著提升图片清晰度,满足学术出版与高质量印刷需求,文中还包含效果对比、进阶设置及常见问题解答。 阅读详情

什么是java反射机制

反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。rol.

通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
 反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

Java反射框架主要提供以下功能:

  • 1.在运行时判断任意一个对象所属的类;
  • 2.在运行时构造任意一个类的对象;
  • 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
  • 4.在运行时调用任意一个对象的方法

重点:是运行时而不是编译时

反射的主要用途

 很多人都认为反射在实际的Java开发应用中并不广泛,其实不然。
 当我们在使用IDE(如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。
 反射最重要的用途就是开发各种通用框架。
 很多框架(比如Spring)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
 举一个例子,在运用Struts 2框架的开发中我们一般会在struts.xml里去配置Action;
例如:


本人现在正在写一些反射基础的应用

使用反射创建反射对象的三种方法--都用Dog类进行举例
1.   类名.class
Class<Dog> clazz=Dog.class;

2.  getclass()方法
Dog dog=new Dog();
Class<Dog> clazz=dog.getclass();

3. class.forName()方法
try{
Class<Dog> clazz=class.forName("包名.类名 "); 
}catch(Exception e){
e.printStackTrace();
}

判断一个对象是不是那类的实例
一般地,我们用instanceof关键字来判断是否为某个类的实例。同时我们也可以借助反射中Class对象的isInstance()方法来判断是否为某个类的实例,它是一个Native方法:

 4.获取方法

获取某个Class对象的方法集合,主要有以下几个方法:
getDeclaredMethods()方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

1
public Method[] getDeclaredMethods() throws SecurityException

getMethods()方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。

1
public Method[] getMethods() throws SecurityException

getMethod方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象

下面我们通过一个例子来看这些方法

//用反射调用方法
Method m=null;//创建一个Method的实体化对象
try {
m=s.getDeclaredMethod("friendlyStudy", int.class);
m.invoke(stu, 3);
m=s.getDeclaredMethod("privateStudy", int.class);
m.setAccessible(true);//调用私用方法
m.invoke(stu, 78);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("----------------------");
System.out.println("调用构造方法");
//调用构造方法
Constructor<?>[] cons=null;
try {
cons=s.getDeclaredConstructors();//取得public的构造函数
for (Constructor<?> constructor : cons) {
System.out.println(constructor);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}




System.out.println("---------------------------");
System.out.println("调用构造方法中的具体一个方法");
Constructor<?>con=null;
try {
con=s.getConstructor(String.class,int.class);
stu=(Student)con.newInstance("zhangs",88);
System.out.println(stu.name);
System.out.println(stu.getAge());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("=================================");
System.out.println("调用构造方法中的具体一个方法2");
Class<?> c=stu.getClass();
Constructor<?>con1=null;
try {
con1=c.getDeclaredConstructor(String.class);
con1.setAccessible(true);
stu=(Student)con1.newInstance("海绵宝宝 da shabi");
System.out.println(stu.name);

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("=================================");
System.out.println("调用构造方法中的具体一个方法3");
Class<?> cc=null;
Constructor<?>con3=null;
try {
cc=Class.forName("javaoopFanshe1127.Student");
con3=cc.getDeclaredConstructor(String.class);
con3.setAccessible(true);
stu=(Student)con3.newInstance("海绵宝宝 ");
System.out.println(stu.name);
} catch (Exception e) {
// TODO: handle exception
}
}

-----------------------------------------------------------------------------
上面 的例子结果为
_-----------------------------------------
调用friendlyStudy学习时间是:3
调用privateStudy学习时间是:78
----------------------
调用构造方法
public javaoopFanshe1127.Student(java.lang.String,int)
private javaoopFanshe1127.Student(java.lang.String,java.lang.String)
private javaoopFanshe1127.Student(java.lang.String)
public javaoopFanshe1127.Student()
---------------------------
调用构造方法中的具体一个方法
zhangs
88
=================================
调用构造方法中的具体一个方法2
海绵宝宝 da shabi
=================================
调用构造方法中的具体一个方法3
海绵宝宝 

6.利用反射创建数组

数组在Java里是比较特殊的一种类型,它可以赋值给一个Object Reference。下面我们看一看利用反射创建数组的例子:

1
2
3
4
5
6
7
8
9
10
11
12
public static void testArray() throws ClassNotFoundException {
Class<?> cls = Class.forName("java.lang.String");
Object array = Array.newInstance(cls,25);
//往数组里添加内容
Array.set(array,0,"hello");
Array.set(array,1,"Java");
Array.set(array,2,"fuck");
Array.set(array,3,"Scala");
Array.set(array,4,"Clojure");
//获取某一项的内容
System.out.println(Array.get(array,3));
}

其中的Array类为java.lang.reflect.Array类。我们通过Array.newInstance()创建数组对象,它的原型是:

1
2
3
4
public static Object newInstance(Class<?> componentType, int length)
throws NegativeArraySizeException {
return newArray(componentType, length);
}

而newArray()方法是一个Native方法,它在Hotspot JVM里的具体实现我们后边再研究,这里先把源码贴出来

1
2
private static native Object newArray(Class<?> componentType, int length)
throws NegativeArraySizeException;

源码目录:openjdk\hotspot\src\share\vm\runtime\reflection.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
if (element_mirror == NULL) {
THROW_0(vmSymbols::java_lang_NullPointerException());
}
if (length < 0) {
THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
}
if (java_lang_Class::is_primitive(element_mirror)) {
Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
} else {
Klass* k = java_lang_Class::as_Klass(element_mirror);
if (k->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
THROW_0(vmSymbols::java_lang_IllegalArgumentException());
}
return oopFactory::new_objArray(k, length, THREAD);
}
}

另外,Array类的set()和get()方法都为Native方法,在HotSpot JVM里分别对应Reflection::array_set和Reflection::array_get方法,这里就不详细解析了。





手把手教你学PCIE--所有 PF(Physical Function)共同管理和分配 VF 但具体如何分配和使用 VF 取决于硬件设计、驱动程序配置以及实际应用场景。 阅读详情

相关推荐

广义平均(Generalized Mean, GeM)

本位介绍了广义平均操作的定义和简要推导,帮助大家理解其含义。

qq_45802280的博客 4547

(20-09-06)学习内容

学习目标与内容: 1.什么是反射机制 获取指定名称的字节码文件进行加载并获取其中的内容并调用(1.获取对象的字节码2.调用其中的内容,字段,方法,构造函数) 2.为什么要用反射机制 1.提高程序的扩展性 2.用起来相对方便 3.反射怎么使用 2。配置文件(动态参数) 3.动态信息的放置到配置文件中 Class中的forName();方法 反射中获取本类构造函数的方法:Constructor(Constructor提供了一个类的单个构造函数的信息和访问):构造器对象; 反射可以拿到的内容:(对应的参数类型的

lk00000111的博客 1360

游戏开发实战:用UE4 Marschner模型打造次世代头发渲染(附Shader代码解析)

本文详细解析了如何在UE4中使用Marschner模型实现次世代头发渲染,包括Shader代码逐行解读与参数调优。通过对比传统Kajiya-Kay模型,展示了Marschner模型在物理精确性和视觉效果上的优势,并提供了性能优化与实战技巧,帮助技术美术师提升游戏角色渲染品质。

weixin_28223453的博客 240

Java 利用Array.newInstance创建动态数组突破Array本身限制

1,创建一个字符串数组修改其中的索引值并打印 /** * Created by Administrator on 2018/1/28. */ public class DynamicArrayTest { public static final void main(String... args) throws Exception { Class clazz =

FeelTouch Labs 8341

光猫桥接后网速不升反降?可能是你的路由器在“偷懒”!

本文详细分析了光猫桥接后网速不升反降的常见原因,包括路由器性能不足、MTU/MSS值设置错误等,并提供了四个关键排查步骤和路由器选购指南。通过优化PPPoE拨号设置和硬件配置,帮助用户解决网速下降问题,提升家庭网络性能。

hqmln的博客 615

工程师必看:如何用MINITAB快速计算传感器寿命(附详细步骤)

本文为工程师提供了使用MINITAB软件快速计算传感器寿命的详细实战指南。文章重点阐述了如何通过数据预处理、回归分析拟合阿伦尼斯模型,并最终预测平均寿命与置信区间,帮助工程师高效处理加速寿命试验数据,提升可靠性分析工作的准确性与效率。

weixin_29296241的博客 248

集合类学习之Arraylist 源码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33890526的博客 162

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 467

深入解析Java反射基础

博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好。 本篇为基本篇,基于JDK 1.8。一、回顾:什么是反射?反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。Oracle官方对反射的解释是Reflecti

昝昝的博客 597

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2879

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7335

深入理解Java类型信息(Class对象)与反射机制

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.youkuaiyun.com/javazejian/article/details/70768369 出自【zejian的博客】 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解

zejian的博客 16万+

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1347

Java中的反射机制的深入理解

深入理解Java中的反射反射的概念 反射的概念 反射: Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息 程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且调用相关属性,这些对象的类型在编译时是未知的 也就是说 ,可以通过反...

攻城狮Chova的博客 4606

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【深入理解Java反射机制】

Java反射(Reflection)是Java语言的一个强大特性,它允许程序在运行时检查和操作类、方法、字段等元素。

L-Blog 1022

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一文带你深入理解【Java基础】· Java反射机制(下)

Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!!!如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多呀!❤❤❤爱你们!!!目录【往期回顾】1. 获取运行时类的完整结构1.1通过反射获取运行时类的完整结构FieldMethodSuperclassInterfaceAnnotation实现的全部接口所继承的父类。

麟-小白的博客 670

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入理解 Java 反射机制

获取类的构造方法、方法、字段、注解等信息。动态创建对象。访问和修改对象的属性。调用对象的方法。反射机制是 Java 的一种运行时特性,它依赖于包中的类,如ClassMethodField等。Java 反射机制是一个强大的工具,使得 Java 程序能够动态地检查和操作对象。然而,反射的灵活性也伴随着性能的代价。在实际开发中,应该根据需求合理地使用反射,避免在性能要求高的部分频繁使用反射。

weixin_62818371的博客 1057

深入理解Java中的反射机制

深入理解Java中的反射机制大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,反射机制是一种非常强大的工具,它允许程序在运行时检查和操作类、方法、字段等。反射机制不仅在框架开发中有着广泛的应用,而且在某些动态需求场景中也是必不可少的。本文将深入探讨Java中的反射机制,通过代码...

weixin_29238147的博客 154

【Java】深入理解反射机制

反射是非常重要的知识 JAVA让我们运行时识别对象和类的信息,有俩个方式:一个是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息。另一种是反射机制,它允许我们运行时发现和使用类的信息。 –编程思想 反射的描述 JAVA反射机制是运行状态中,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用方法的功能称为jav...

黄骏捷的博客 370

深入理解java反射机制

一,java的核心机制java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在其上面运行Java代码编译后的字节码程序,java虚拟机实现了平台无关性。 Java垃圾回收(Garbage Collection):自动释放不用对象

欸奥维 3万+

深入理解 Java 中的反射机制

一. 什么是反射 在理解反射这个概念之前,我们先来理解 Java 中的 “正射”。 在编写代码时,如果需要使用某一个类,必定先会去了解这是一个什么类,用来做什么,有怎么样的功能。之后才会对这个类进行实例化,以及使用对应的实例化对象进行下一步的操作。 而反射则是在代码一开始编写时不知道要初始化的类是什么,自然也无法使用 new 关键字来创建对象。 它的定义如下: 在运行状态中,对于任意一个类,都能够在运行时知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息

盛夏温暖流年 630

深入理解java的反射机制

今天将从以下4方面来系统的学习一下java的反射机制: java反射是什么 java反射(Reflection)底层实现原理 java反射的简单演示 java反射的应用场景 1,java反射是什么 首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件...

dns007 454

Java之反射机制深入理解

反射机制是Java中的一个难点,反射机制也是各个框架的核心,个人认为正是反射机制的存在,才显得Java的OOP特性的强大,这篇博客中,笔者会基于自己的理解和阅读的书籍以及博客,做一个比较详细的介绍,剖析底层实现原理(仅供参考),如有存在错误的地方,欢迎指正。 Java反射机制 Java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制。 反射机制主要提供的功能 在运行时

lensen明 204

深入理解Java反射机制

反射是Java语言提供的一种能力,允许程序在运行时查询、访问和修改其自身的结构和行为。它通过包中的类来实现,包括ClassMethod和Field等。

无远弗届 878

深入理解Java的反射机制

说反射之前大家先理解一下Java的JVM吧 什么是JVM,Java的虚拟机,Java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,只不过他的作用是用来跑你的代码的。Java的内存模型,我们关注的点,一个方法区,一个栈,一个堆。 假如你写了一段代码:Object o=new Object(); 运行了起来! 首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进J...

LeBronJJJ的博客 249
上一篇: Oracle数据库初学者
下一篇: Oracle数据库中的常用的方法及对表的操作
橘子汽水&白茶乌龙
博客等级 码龄10年 33粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值