`

Java反射浅析

阅读更多

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

   2 在运行时判断任意一个类所具有的成员变量和方法;
   3 在运行时判断任意一个对象所属的类;

   4 在运行时调用任意一个对象的方法;
   5 生成动态代理。

 

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):第一步,先要得到对象。

第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 反射机制浅析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...

    浅析Java 反射机制的用途和缺点

    "浅析Java 反射机制的用途和缺点" Java 反射机制是一种强大的技术,可以让应用程序做一些几乎不可能做到的事情。它可以让程序在运行时检测或修改程序行为,是 Java 语言中一个相对高级的特性。开发者可以使用反射...

    深入浅析Java反射机制

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了程序编译时的静态性,提供了对类、接口、字段和方法的动态访问能力。通过反射,...

    Java反射机制(Reflection)浅析

    Java反射机制(Reflection)是Java语言提供的一种强大的能力,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要根据条件动态调用类的...

    浅析Java泛型的使用.pdf

    这意味着在运行时,你无法通过反射获取到如List&lt;String&gt;.class这样的泛型类实例。例如,List和List在运行时实际上是相同的类,都变成了List。类型擦除使得泛型在运行时无法直接检测,但编译时的类型检查仍然确保了...

    Java基础知识点 - 内容比较全面

    7. **Java中的反射机制**:反射允许程序在运行时检查类、接口、字段和方法的信息,动态创建对象并调用方法。它是Java动态性的重要体现,广泛应用于插件系统、框架和测试工具。 8. **Java中Heap与Stack的区别**:堆...

    java与php的区别浅析

    Java与PHP的区别浅析 Java是一种通用的面向对象编程语言,旨在生成可在任何地方使用相同代码的代码。这种编程语言是基于类的,面向对象的和人类可读的。它支持服务器端和客户端。Java既可以编译也可以解释。Java...

    深入浅析Java注解框架

    Java注解框架是Java编程语言中的一个重要特性,它允许开发者在代码中添加元数据,以提供额外的信息,如编译器指令、运行时检查或框架的配置信息。注解的本质是与程序代码关联的特殊标记,它们在编译时或运行时通过...

    Android框架浅析之锁屏(Keyguard)机制原理

    ### Android框架浅析之锁屏(Keyguard)机制原理 #### 一、锁屏界面的组成 锁屏(Keyguard)是Android系统中的一个重要组成部分,它主要用于保护用户的隐私数据不被未授权访问。锁屏功能主要由两个部分组成:解锁...

    XML架构浅析.pdf

    在现代编程环境中,如.NET Framework和Java,反射扮演着重要角色。它可以减少开发者必须考虑的问题数量,并且使得创建更高效的工具变得可能。例如,在.NET Framework中,公共语言运行时(CLR)提供了安全、垃圾回收...

    浅析java中 Spring MVC 拦截器作用及其实现

    1. **依赖关系**:拦截器是基于Spring框架,依赖于反射机制,仅能处理请求;而过滤器基于Servlet规范,通过回调函数实现,过滤范围更广,可以处理请求和响应。 2. **控制流程**:拦截器可以决定是否继续处理请求,...

    JFinal技术架构浅析.doc

    JFinal 是一个基于Java语言的轻量级Web开发框架,其设计目标是简化开发、提高效率,让开发者能够更专注于业务逻辑的实现。本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **...

    Java动态代理简单应用

    概念  代理模式是基本的设计模式之一,它是开发者为了提供额外的或...  Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客Java发射机制浅析。  原理  Spring核心AOP实现技术之一是采用

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

    #### `hashCode()`方法浅析 `hashCode()`方法是`Object`类中的一个方法,用于生成对象的哈希码。这个哈希码通常是一个整数值,用来表示对象的一个简短标识符。Java利用哈希码来提高查找对象的速度,尤其是在集合框架...

    浅析道路检测技术的要点及应用.docx

    激光路面平整度仪通过激光反射信号差异判断路面高低,激光弯沉仪则用于评估道路在荷载下的变形。激光技术具有非接触、高速、高精度的优势,但在某些情况下可能无法精确反映路面的轮廓特征。 3. 图像检测 图像检测...

    JNI资源汇总

    - **类和结构体**:JNI支持对Java类的反射操作,以及将Java对象映射到C/C++的结构体。 5. **学习资源**: - "Android JNI开发入门与提高":这份文档可能涵盖了JNI的基础知识,如如何创建和调用本地方法,以及进阶...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    2. 通过反射调用类的方法。 3. 初始化子类时,如果父类尚未初始化,会先初始化父类。 4. JVM启动时,初始化指定的主类。 `Class.forName()`方法在Java官方文档中被描述为在运行时动态加载一个类并返回`Class`对象。...

Global site tag (gtag.js) - Google Analytics