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

java反射教程

java反射教程_Java反射教程相关推荐

  1. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  2. java 反射基础_Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射.反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的 ...

  3. java 反射教程_Java基础教程——反射机制

    Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...

  4. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  5. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  6. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  7. Java的反射作用_java反射机制的作用与优点

    java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...

  8. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  9. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

最新文章

  1. tcp/ip 协议栈Linux内核源码分析十 邻居子系统分析一 概述通用邻居框架
  2. js基础--获取浏览器当前页面的滚动条高度的兼容写法
  3. mysql5.7.21源码安装
  4. VM虚拟机显示不能铺满问题
  5. ionic最新安装教程
  6. c web mysql数据库_C连接Mysql数据库代码
  7. Ubuntu 安装 typora
  8. MyEclipse配置TomCat环境(图文详解)
  9. win10 电脑没声音 控制面板 realtek高清晰音频管理器没有解决方案
  10. 为什么小角度的弧度值可以近似等于正切值或者正弦值?
  11. 数据挖掘之航空公司客户价值分析
  12. 女孩,请把第一胎留给丈夫!!!
  13. 正样本/反(负)样本/易区分样本/难区分样本
  14. [找工作]数据挖掘岗位2016校招要求
  15. swift 学习-- 元组
  16. 如何在sRGB和CIEXYZ之间进行转换
  17. 计算机网络部分习题答案
  18. win10 运行 bat 文件闪过解决办法
  19. php api 接口
  20. Unity3d 微信小程序(小游戏)项目实现流量主接入功能(含源码)

热门文章

  1. 【Floyed】廉价最短路径
  2. 今日头条大佬十年面试了 2000 人,总结了这 5 点
  3. 面试进阶之字符串常量池
  4. Wamp升级php到7.3版本
  5. 有些事,父母一定不能依着孩子!
  6. 循环输入某同学 S1 结业考试的 5 门课成绩,并计算平均分
  7. 想对你们每个人说的话
  8. 第四章使用jQuery操作DOM元素
  9. JS向对象中添加和删除属性
  10. React中自定义方法