Java反射教程

在本教程中,我主要编写一些示例来介绍Java反射可以做什么。 希望它可以给您这个概念的概述。 请留下您的评论以寻求建议。

什么是反射?

简而言之,反射是程序在运行时检查和修改对象的结构和行为的能力。

这种概念有时与内省混合在一起。 自省(类型自省)是程序在运行时检查对象的类型或属性的能力。 因此,它是反射的子集。 某些语言支持自省,但不支持反射,例如C ++。

为什么我们需要反思?

反射使我们能够执行以下操作:

  • 在运行时检查对象的类
  • 在运行时为类构造一个对象
  • 在运行时检查类的字段和方法
  • 在运行时调用对象的任何方法

例如, JUnit使用反射来查看带有@Test批注的方法,然后在运行单元测试时调用这些方法。 (这是一组有关如何使用JUnit的示例。)

示例1:从对象获取类名

package myreflection;
import java.lang.reflect.Method;public class ReflectionHelloWorld {public static void main(String[] args){Foo f = new Foo();System.out.println(f.getClass().getName());			}
}class Foo {public void print() {System.out.println("abc");}
}

输出:

myreflection.Foo

示例2:对未知对象调用方法

对于下面的代码示例,未知对象的图像类型。 通过使用反射,代码可以使用该对象并找出该对象是否具有称为“ print”的方法,然后对其进行调用。

package myreflection;
import java.lang.reflect.Method;public class ReflectionHelloWorld {public static void main(String[] args){Foo f = new Foo();Method method;try {method = f.getClass().getMethod("print", new Class<?>[0]);method.invoke(f);} catch (Exception e) {e.printStackTrace();}			}
}class Foo {public void print() {System.out.println("abc");}
}
abc

示例3:从Class实例创建对象

package myreflection;public class ReflectionHelloWorld {public static void main(String[] args){//create instance of "Class"Class<?> c = null;try{c=Class.forName("myreflection.Foo");}catch(Exception e){e.printStackTrace();}//create instance of "Foo"Foo f = null;try {f = (Foo) c.newInstance();} catch (Exception e) {e.printStackTrace();}	f.print();}
}class Foo {public void print() {System.out.println("abc");}
}

示例4:获取构造函数并创建实例

package myreflection;import java.lang.reflect.Constructor;public class ReflectionHelloWorld {public static void main(String[] args){//create instance of "Class"Class<?> c = null;try{c=Class.forName("myreflection.Foo");}catch(Exception e){e.printStackTrace();}//create instance of "Foo"Foo f1 = null;Foo f2 = null;//get all constructorsConstructor<?> cons[] = c.getConstructors();try {f1 = (Foo) cons[0].newInstance();f2 = (Foo) cons[1].newInstance("abc");} catch (Exception e) {e.printStackTrace();}	f1.print();f2.print();}
}class Foo {String s; public Foo(){}public Foo(String s){this.s=s;}public void print() {System.out.println(s);}
}

输出:

nullabc

此外,您可以使用Class实例获取已实现的接口,超类,声明的字段等。

示例5:通过反射更改数组大小

package myreflection;import java.lang.reflect.Array;public class ReflectionHelloWorld {public static void main(String[] args) {int[] intArray = { 1, 2, 3, 4, 5 };int[] newIntArray = (int[]) changeArraySize(intArray, 10);print(newIntArray);String[] atr = { "a", "b", "c", "d", "e" };String[] str1 = (String[]) changeArraySize(atr, 10);print(str1);}// change array sizepublic static Object changeArraySize(Object obj, int len) {Class<?> arr = obj.getClass().getComponentType();Object newArray = Array.newInstance(arr, len);//do array copyint co = Array.getLength(obj);System.arraycopy(obj, 0, newArray, 0, co);return newArray;}// printpublic static void print(Object obj) {Class<?> c = obj.getClass();if (!c.isArray()) {return;}System.out.println("\nArray length: " + Array.getLength(obj));for (int i = 0; i < Array.getLength(obj); i++) {System.out.print(Array.get(obj, i) + " ");}}
}

输出:

Array length: 10
1 2 3 4 5 0 0 0 0 0
Array length: 10
a b c d e null null null null null

摘要

上面的代码示例显示了Java反射提供的一小组功能。 阅读这些示例可能只会使您对Java有所了解 ,您可能想阅读Oracle网站上的更多信息 。

参考:我们的JCG合作伙伴 Wang Xiaoran在Programcreek博客上的Java反射教程 。

翻译自: https://www.javacodegeeks.com/2013/09/java-reflection-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NFS网络共享文件系统

1、nfs服务端配置操作 1.1 创建所需的共享目录--源 mkdir /data/rw #rw代表同步的数据可读可写 1.2 对共享目录进行授权 chown -R nfsnobody.nfsnobody /data/rw #非必需&#xff0c;根据业务需求 1.3 修改nfs服务配置文件 vim /etc/exports /data/rw 172.16.1.0/…

国家开放大学形成性考核 统一资料 参考试题

试卷代号&#xff1a;1174 水工钢筋混凝土结构&#xff08;本&#xff09;参考试题 一、选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;在所列备选项中&#xff0c;选1项正确的或最好的作为答案&#xff0c;将选项号填入各题的括号中&#xff09; 1.钢筋混凝土结…

两个向量之间的夹角公式_向量的内积

向量的内积也叫向量的数量积、点积。我们定义两个向量的内积是一个数: 其中 是这两个向量的夹角。 对于向量的内积,最重要的一个结论是: 定理1:两向量垂直的充分必要条件是它们的内积为 0,即 这个定理我们几乎不用证明了,因为从定义来看,如果两个向量都不零向量,则只能…

Go strings.Builder

Go strings.Builder 字符串拼接操作优化 最开始的时候&#xff0c;可能会使用如下的操作&#xff1a; package mainfunc main() {ss : []string{"sh","hn","test",}var str stringfor _, s : range ss {str s}print(str) }与许多支持string类型…

springcloud 入门 10 (eureka高可用)

eureka高可用: 说白了&#xff0c;就是加一个实例作为原实例的备份&#xff0c;然后一起对外提供服务。这样可以保证在一台机器宕机的时候&#xff0c;整个系统不会死掉。保证其继续对外服务。 eureka的集群化&#xff1a; 服务注册中心Eureka Server&#xff0c;是一个实例&am…

为什么REST如此重要

这篇文章致力于REST&#xff0c;一种塑造Web服务的体系结构风格&#xff0c;以及IT历史上最容易被误解的概念。 这篇文章针对的是那些正在设计Web服务api的人&#xff0c;他们并未完全了解REST的实际含义。 我想给你个主意。 这篇文章也发给了那些想知道REST意味着什么的人&…

string类有可以调换方向的函数吗_String类中常用的操作

一、获取:1、获取字符串的长度(注意是方法&#xff0c;不是跟数组的属性一样的)int length();1 public static void getLength(){2 String s "java01";3 int len s.length();4 System.out.println(len);5 }2、根据位置&#xff0c;获取该位置的那一个字符(只能是单…

你真的懂js获取可视区宽高吗

可能你会觉得获取可视区宽高不是很简单吗 原生js获取高度不就是就window.innerHeight一句话的事&#xff0c;可是真的这么简单吗 来看个测试页面,如果页面带有横向纵向的滚动条&#xff0c;我们打印出各个高度进行查看对比 顺便你也可以看看document.body和document.documentEl…

工作第七天

今天完成了一个简易的oauth服务器&#xff0c;通过login跳转到oauth保存uri和client_id&#xff0c;等待用户登录判断是否能get到user同时判断用户名和密码是否匹配&#xff0c;重定向到uri同时增加code参数&#xff0c;通过判断是否有code重定向回oauth&#xff0c;如果有code…

网上linux实验平台,Linux操作系统实验教程

第一部分 Linux操作系统基本原理.第1章 Linux操作系统简介1.1 Linux的渊源和发展简史1.2 Linux的基本特性1.3 Linux内核的开发模式与内核版本号1.4 Linux发行版介绍1.5 Linux内核源代码组织结构1.6 学习Linux的辅助软件介绍第2章 Linux的进程管理2.1 进程与进程描述符2.2 进程状…

詹金斯的Maven报告

代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍如何创建一些…

python实现矩阵叉乘_矩阵乘法的纯Python实现 | 离开Python库!!

点击关注我哦一篇文章带你了解矩阵乘法的纯Python实现在《这篇文章》中&#xff0c;我们有简单提到“矩阵乘法”的相关知识&#xff0c;如果你不记得了&#xff0c;可以复习一下这张图片。想起来了没&#xff1f;本篇文章将深入探讨在没有机器学习库的情况下如何从零实现矩阵乘…

Github Actions:再次改变软件开发

本文转自 FEPulse 公众号&#xff08;微信搜索 FEPulse&#xff0c;精选国内外最新前端资讯&#xff0c;为你把握前端脉搏&#xff09;。 Github Actions 是 GitHub Universe 大会上发布的&#xff0c;被 Github 主管 Sam Lambert 称为“再次改变软件开发”的一款重磅功能&…

为别人软件加入广告或者密码(特别思路)

洪雨的的这款软件比较奇特&#xff0c;是忽然想到一个思路&#xff0c;然后实现了一下。 exe文件都有一个很有趣的地方&#xff0c;只要内部完整&#xff0c;就可以运行。比如一个exe文件&#xff0c;我们运行的时候&#xff0c;电脑知道他是exe所以可以直接运行。假如洪雨将它…

c free语言自定义函数,C 语言free函数的工作原理

今天在网上看到了这样一个问题&#xff0c;“如果malloc 了一块字符串的内存&#xff0c;然后&#xff0c;它改变了这个字符串的大小&#xff0c;问会不会有一部分内存没有被释放掉。”这个问题&#xff0c;以前的确没有仔细想过。当然&#xff0c;我觉得是肯定会释放掉的&…

Django 错误跳转页面

原网站&#xff1a;https://blog.csdn.net/goupper1991/article/details/50736826 django404&#xff0c;500错误自定义页面&#xff1a; 将 改为 1.修改settings文件DEBUG FalseALLOWED_HOSTS [127.0.0.1, localhost]或者ALLOWED_HOSTS [*]2.配置urls文件from django.conf.…

ElasticSearch-Hadoop:从Hadoop到ElasticSearch的产品视图计数索引和客户顶部搜索查询...

这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引。 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查询编制索引。 分析的数据可以进一步在网站上使用&#xff0c;以显示最近浏览过的客户&#xff0c;产品浏…

伸缩轨道_深度解析——伸缩喷漆房为什么这么受欢迎!

伸缩式喷漆房是一种环保喷漆设备&#xff0c;它可以在使用时&#xff0c;自动展开形成封闭或半封闭的环保喷漆房&#xff0c;不使用时收缩合拢到一处的特殊环保喷漆房设备&#xff0c;由于伸缩式喷漆房外观大方、简单实用且投资费用低&#xff0c;它在现代涂装应用中越发广泛。…

snippet,让你编码效率翻倍

为什么谈到Snippet 今天下午在用vscode做小程序的时候&#xff0c;发现很不方便&#xff0c;因为商店里提供的代码片段极为有限&#xff0c;而且平时几乎每天都需要用到代码片段&#xff0c;所以就在思考他们是怎么做到给别人提供代码的&#xff0c;我可以自定义代码片段吗。然…

键盘keydown值表

键盘名称键值&#xff08;keycode&#xff09;键盘名称键值&#xff08;keycode&#xff09;BackSpace8Tab9Clear12Enter13Shift_L16Control_L17Alt_L18Pause19Caps_Lock20Escape27Space32Prior33Next34End35Home36Left37Up38Right39Down40Select41Print42Execute43Insert45Del…