`

JAVA中的反射机制详解(z)

    博客分类:
  • J2SE
阅读更多
  作者:baocl

  JAVA反射机制

  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

  1. 得到某个对象的属性

  1 public Object getProperty(Object owner, String fieldName) throws Exception {

  2 Class ownerClass = owner.getClass();

  3

  4 Field field = ownerClass.getField(fieldName);

  5

  6 Object property = field.get(owner);

  7

  8 return property;

  9 }

  Class ownerClass = owner.getClass():得到该对象的Class。

  Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

  Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。

  2. 得到某个类的静态属性

  1 public Object getStaticProperty(String className, String fieldName)

  2 throws Exception {

  3 Class ownerClass = Class.forName(className);

  4

  5 Field field = ownerClass.getField(fieldName);

  6

  7 Object property = field.get(ownerClass);

  8

  9 return property;

  10 }

  Class ownerClass = Class.forName(className) :首先得到这个类的Class。

  Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

  Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。

  3. 执行某对象的方法

  1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {

  2

  3 Class ownerClass = owner.getClass();

  4

  5 Class[] argsClass = new Class[args.length];

  6

  7 for (int i = 0, j = args.length; i < j; i++) {

  8 argsClass[i] = args[i].getClass();

  9 }

  10

  11 Method method = ownerClass.getMethod(methodName, argsClass);

  12

  13 return method.invoke(owner, args);

  14 }

  Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

  5~9行:配置参数的Class数组,作为寻找Method的条件。

  Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

  method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。

  4. 执行某个类的静态方法

  1 public Object invokeStaticMethod(String className, String methodName,

  2 Object[] args) throws Exception {

  3 Class ownerClass = Class.forName(className);

  4

  5 Class[] argsClass = new Class[args.length];

  6

  7 for (int i = 0, j = args.length; i < j; i++) {

  8 argsClass[i] = args[i].getClass();

  9 }

  10

  11 Method method = ownerClass.getMethod(methodName, argsClass);

  12

  13 return method.invoke(null, args);

  14 }

  基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。

  5. 新建实例

  1

  2 public Object newInstance(String className, Object[] args) throws Exception {

  3 Class newoneClass = Class.forName(className);

  4

  5 Class[] argsClass = new Class[args.length];

  6

  7 for (int i = 0, j = args.length; i < j; i++) {

  8 argsClass[i] = args[i].getClass();

  9 }

  10

  11 Constructor cons = newoneClass.getConstructor(argsClass);

  12

  13 return cons.newInstance(args);

  14

  15 }

  这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

  Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。

  第5~第9行:得到参数的Class数组。

  Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。

  cons.newInstance(args):新建实例。

  6. 判断是否为某个类的实例

  1 public boolean isInstance(Object obj, Class cls) {

  2 return cls.isInstance(obj);

  3 }

  7. 得到数组中的某个元素

  1 public Object getByArray(Object array, int index) {

  2 return Array.get(array,index);

  3 }
分享到:
评论

相关推荐

    java中hashcode()和equals()的详解.docx

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    java复习题库 计算机认证考试

    Java编程中还有许多其他重要概念,例如异常处理、集合框架、IO流、网络编程、多线程同步机制、反射机制等,这些都需要深入学习和理解。在准备计算机认证考试时,除了做题库外,还需要阅读官方文档、参考书籍,以及...

    Java基础+Android面试题

    3. Java反射:包括反射的原理、使用方法以及反射API的使用。反射机制允许程序在运行时访问和修改类的行为。 4. Java注解:注解为Java代码提供元数据,可以用于生成额外的代码、配置信息等。 5. Java IO:详细介绍...

    java面试题 面试必备

    此外,面试官可能还会询问其他Java核心概念,如异常处理、多线程、集合框架、IO流、设计模式、垃圾回收机制、反射以及对JVM的理解等。熟练掌握这些知识点将有助于你在面试中展现出扎实的Java基础和深入的理解。在...

    OCP java SE7 Programmer II Certification Guide

    - **异常处理**:深入讲解Java中的异常处理机制,包括try-catch-finally语句块、throw/throws关键字的使用,自定义异常的创建。 - **集合框架**:Java集合框架的基本概念,各种集合类如List、Set、Map的特性及应用...

    JAVA基本类库.doc

    Class类是Java反射机制的关键部分,它表示运行时的类信息。以下是一些重要的Class类方法: 2.1 `forName(String className)`:静态方法,根据给定的全限定类名返回对应的Class对象,如果没有找到对应类,会抛出`...

    Java 方法签名详解及实例代码

    Java 方法签名是识别和区分同一类中重载方法的关键因素,它由方法名和形参列表构成,不包括返回值。这是因为返回值类型在方法调用时并不影响选择哪个方法执行,只有方法名和参数列表匹配时,Java 才会认为是同一种...

    SpringBoot (4.71G)精华详解

    6.Spring配置信息解析及反射的应用.mp45H$r;h6o(w9m2P1F([ 7.Spring配置bean解析具体过程.mp4 8.Bean定义解析流程详细分析.mp4 9.BeanDefinition完整装配过程详解.mp4*b'X4O0~!n"\;?.q 10.Spring的Bean定义解析全...

    jdk1.8中文版本.7z

    9. ** Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,允许在Java应用程序中执行JavaScript代码。 10. **改进的反射API**:提供了对泛型类型信息的反射访问,使开发者能够获取到泛型的实际类型...

    JDK API 1.6.0 中文版.7z

    6. **反射机制**: `java.lang.reflect`包提供了反射API,允许在运行时动态获取类的信息并操作对象。这对于创建通用代码、实现插件机制或单元测试等场景非常有用。 7. **异常处理**: Java 6中的异常处理机制基于`try...

    参考文档-jdk接口文档.7z

    **Java Development Kit (JDK) 接口文档详解** Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了开发、编译、调试和运行Java应用程序所需的所有工具和库。JDK接口文档,通常称为Java API...

    rt.src1.6.7z

    【标题】"rt.src1.6.7z" 提供的是 JDK 1.6 版本的 `rt.jar` 源代码 ...源代码涵盖了诸如对象创建、类加载、异常处理、集合框架、I/O 流、网络编程、多线程、反射等多个关键领域,对于深入理解 Java 编程语言至关重要。

    探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...

    zcamp:Java编程学习资料

    八、Java反射和注解 反射机制允许程序在运行时检查类的信息,创建和调用类的对象。注解是一种元数据,可以用于提供编译器或运行时系统的信息。掌握这两点可以实现更高级别的编程技巧。 九、Java Swing和JavaFX ...

    OCJP考试资料

    【Java OCJP考试详解】 Java OCJP(Oracle Certified Professional, Java SE 8 Programmer)是Oracle公司为Java开发者提供的专业认证,旨在验证候选人在Java编程语言和平台上的技能和知识。这个认证对于那些希望在...

    中国航信杯

    7. **Class类**:`Class`类在Java中用于类的操作,如动态加载类、获取类的信息等,它是Java反射机制的基础。 8. **运算符优先级**:表达式`(a++) + (++b)`中,后缀`++`优先级高于前缀`++`,且先计算成员变量,因此...

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    spring 入门基础

    同时,Spring利用Java的反射机制,可以在运行时动态地创建和配置对象,使得系统更具灵活性。 4. **依赖注入(DI)** 依赖注入是Spring的核心特性之一,它允许我们声明对象间的依赖关系,而无需在代码中显式创建...

Global site tag (gtag.js) - Google Analytics