`
小杨学JAVA
  • 浏览: 900667 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA反射机制 -getClass

 
阅读更多


JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 
1. 得到某个对象的属性 
Java代码  

Java代码  收藏代码
  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. 得到某个类的静态属性 
Java代码  
Java代码  收藏代码
  1. public Object getStaticProperty(String className, String fieldName)     
  2.              throws Exception {     
  3. //通过这种方式获得类型的要注意,参数是包名+类名  
  4.      Class ownerClass = Class.forName(className);     
  5.       
  6.      Field field = ownerClass.getField(fieldName);     
  7.       
  8.      Object property = field.get(ownerClass);     
  9.       
  10.      return property;     
  11. }   


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

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

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

3. 执行某对象的方法 
Java代码  
Java代码  收藏代码
  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):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。 

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

4. 执行某个类的静态方法 
Java代码  
Java代码  收藏代码
  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. 新建实例 
Java代码  
Java代码  收藏代码
  1. public Object newInstance(String className, Object[] args) throws Exception {     
  2.      Class newoneClass = Class.forName(className);     
  3.       
  4.      Class[] argsClass = new Class[args.length];     
  5.       
  6.      for (int i = 0, j = args.length; i < j; i++) {     
  7.          argsClass[i] = args[i].getClass();     
  8.      }     
  9.       
  10.      Constructor cons = newoneClass.getConstructor(argsClass);     
  11.       
  12.      return cons.newInstance(args);     
  13.       
  14. }   



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

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

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

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

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

6. 判断是否为某个类的实例 
Java代码  
Java代码  收藏代码
  1. public boolean isInstance(Object obj, Class cls) {     
  2.      return cls.isInstance(obj);     
  3. }   



7. 得到数组中的某个元素 
Java代码  
Java代码  收藏代码
  1. public Object getByArray(Object array, int index) {     
  2.      return Array.get(array,index);     
  3. }    


分享到:
评论

相关推荐

    实战java反射机制-让你迅速认识java强大的反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    Java反射机制-PDF文档,详述了反射机制的原理和使用方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。这一机制的核心在于Java.lang.reflect包,提供了Class、Constructor、Method和Field等类,用于获取类的信息...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java-反射机制-源码

    Java反射机制是Java编程语言中的一个强大工具,它允许运行时动态访问类的信息,包括类名、属性、方法以及构造器等。通过反射,我们可以在程序执行过程中创建和操作任何类的对象,即使在编译时未知其具体类型。这种...

    Java反射机制 Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...

    java反射规范--java资源

    Java反射提供了一种强大的机制来处理类和对象,使得程序能够在运行时动态地获取类的信息并对其进行操作。虽然反射提供了一些非常有用的特性,但也存在一些潜在的问题,比如性能开销较大、安全性问题等。因此,在使用...

    JAVA基础--JAVA中的反射机制详解

    JAVA 反射机制详解 JAVA 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许程序在运行时获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。 Java 反射机制主要提供了以下...

    JAVA反射机制应用

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

    关于Java的反射机制-你需要理解这些.docx

    Java的反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。这一特性使得Java具有高度的灵活性和可扩展性,特别是在处理元数据、框架开发、插件系统以及序列化等方面有着广泛...

    Java反射机制笔记(简单易懂)

    Java反射机制笔记 Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态...

    JAVA反射机制中getClass和class对比分析

    JAVA反射机制中getClass和class对比分析 JAVA反射机制中getClass和class对比分析是JAVA编程中一个重要的知识点。JAVA反射机制中,getClass和class都是获取类名的方法,但是它们有着本质的区别。 首先,让我们了解...

    java学习资料-反射机制深入理解剖析

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这个特性使得Java具有高度的灵活性和强大的功能,尤其是在开发框架、插件系统以及元数据处理等方面有着广泛的...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    java反射机制详解与应用.pdf

    Java 反射机制详解与应用 Java 反射机制是一种非常强大的动态相关机制,允许 Java 程序在运行时加载、探知、使用编译期间完全未知的类别。这种机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射机制课件ppt

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...

Global site tag (gtag.js) - Google Analytics