`

java 反射 Field类

    博客分类:
  • java
阅读更多

原文出处:http://eeelin.iteye.com/blog/533658

java 反射 Field类 

-------用到一个bean 

Java代码   收藏代码
  1. package com.ncs;  
  2.   
  3. public class Point {  
  4.   
  5.     private int x;  
  6.     public int y;  
  7.       
  8.     public Point(int x, int y) {  
  9.         super();  
  10.         this.x = x;  
  11.         this.y = y;  
  12.     }  
  13.       
  14. }  


-------------------- 

Java代码   收藏代码
  1. package com.ncs;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. //need another bean Point  
  6. public class ReflectTest {  
  7.     //★这里说的Field都是 类 身上的,不是实例上的  
  8.     public static void main(String[] args) throws Exception {  
  9.           
  10.         Point pt1 = new Point(3,5);  
  11.           
  12.         //得到一个字段  
  13.         Field fieldY = pt1.getClass().getField("y"); //y 是变量名  
  14.         //fieldY的值是5么?? 大错特错  
  15.         //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊  
  16.         //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值  
  17.         //要这样  
  18.         System.out.println(fieldY.get(pt1)); //这才是5  
  19.           
  20.         //现在要x了  
  21.           
  22.         /*  
  23.         Field fieldX = pt1.getClass().getField("x"); //x 是变量名 
  24.         System.out.println(fieldX.get(pt1));  
  25.         */  
  26.           
  27.         //运行 报错 私有的,找不到  
  28.         //NoSuchFieldException  
  29.         //说明getField 只可以得到 公有的  
  30.         //怎么得到私有的呢??  
  31.           
  32.         /* 
  33.         Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来 
  34.         //然后轮到这里错了 
  35.         // java.lang.IllegalAccessException: 
  36.         //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private" 
  37.         System.out.println(fieldX.get(pt1)); 
  38.         */  
  39.           
  40.         //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了  
  41.           
  42.         //暴力反射    
  43.         Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来  
  44.         fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了  
  45.         System.out.println(fieldX.get(pt1));   
  46.           
  47.         //out 3 OK!!  
  48.           
  49.           
  50.     }  
  51. }  


---------------------------下面做的小实验,把一个类里所有String类型的字段里的值 b 变 a 

Java代码   收藏代码
  1. package com.ncs;  
  2.   
  3. public class Point {  
  4.   
  5.     private int x;  
  6.     public int y;  
  7.       
  8.     public  String s1 ="ball";  
  9.     public String s2="hubin";  
  10.     public String s3="zhangxiaoxiang";  
  11.     //做实验而已,字段不可能是 public 的  
  12.       
  13.     public Point(int x, int y) {  
  14.         super();  
  15.         this.x = x;  
  16.         this.y = y;  
  17.     }  
  18.       
  19. }  


---------------------------- 

Java代码   收藏代码
  1. package com.ncs;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. //need another bean Point  
  6. public class ReflectTest {  
  7.       
  8.     public static void main(String[] args) throws Exception {  
  9.           
  10.         Point pt1 = new Point(3,5);  
  11.           
  12.         //get all fields  
  13.         Field[] fields = pt1.getClass().getFields();   
  14.           
  15.         for(Field field : fields ) {  
  16.             //我说的是String 类型的字段,当然要选择一下  
  17.             //if(field.getType().equals(String.class)) {  
  18.             //字节码都是一份的,干什么用equals啊  
  19.             if(field.getType()== String.class) {  
  20.                 String oldValue = (String)field.get(pt1);  
  21.                 String newValue = oldValue.replace('b''a');  
  22.                 //改 对象的字段  
  23.                 field.set(pt1, newValue);  
  24.                   
  25.             }  
  26.         }  
  27.           
  28.         System.out.println(pt1.s1);  
  29.         System.out.println(pt1.s2);  
  30.         System.out.println(pt1.s3);  
  31.           
  32.         //aall  
  33.         //huain  
  34.         //zhangxiaoxiang  
  35.   
  36.     }  
  37. }  

 总结:获取Class对象的信息方式的步骤:

 

1.创建Class对象 方法1 Class cla=Class.forName(“PATH”)

                           方法2 CLass cla=实例.getclass();

                           方法3 Class cla=类.class

2.使用Field(域),Method(方法),Constructor(构造方法),Package(包),Annotation(注释),通过调用              

          cla.getXXXX方法来获取相关信息

             getFields()获得某个类的所有的公共(public)的字段,包括父类。 
             getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,

            但是不包括父类的申明字段。 
            同样类似的还有getConstructors()和getDeclaredConstructors(),
          getMethods()和getDeclaredMethods()。
     另外还有getField(String)和getDeclaredField(String)方法都是用来过去反射类中指定的属性的方法,要注     意的是getField方法只能取到反射类中公有的属性,而getDeclaredField方法都能取到。 
这里还用到了Field 类的setAccessible方法,它是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false。另外Field类还有set(Object AttributeName,Object value)方法,可以改变指定属性的值。 

3.获取父类以及内部类的方式略有不同

4.当使用cla.getMethods的时候调用的是该类以及该父类的全部公有方法

5.当使用Declared调用的是该类的全部方法包含私有方法,在域,构造方法中同样适用

6.当反射类无公有构造方法时无法直接使用newInstance方法,则使用

Method cs=cla.getMethod("getInstance",null);//获取方法
Calendar calendar=(Calendar) cs.invoke(cla, null);//执行获取的方法,参数1为执行方法的对象,参数2表示该方法的参数
Date df=calendar.getTime();
System.out.println(df.toString());

分享到:
评论

相关推荐

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    java反射组件——Field

    ### Java反射机制之Field组件详解 #### 一、引言 在Java开发中,反射机制是一种非常强大的工具,它能够让我们在运行时获取类的信息并操纵对象的状态。Field作为Java反射机制的重要组成部分之一,主要用于获取类中...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    Java反射调用工具类

    Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...

    java 利用反射获取内部类静态成员变量的值操作.docx

    本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...

    java反射获取所有属性,获取所有get方法,包括子类父类

    总结,Java反射机制为我们提供了强大的动态性,能够方便地获取和操作类的属性和方法,包括私有成员和子类父类中的成员。通过熟练掌握反射技术,开发者可以实现更灵活、更动态的代码,但也需要谨慎使用,以避免潜在的...

    java反射例子,封装了一个反射帮助类

    Java反射是Java编程语言中的一个重要特性,它允许运行时访问和操作类、接口、字段和方法等信息。在Java中,反射提供了动态类型的能力,使我们可以在程序运行时检查类的信息,创建和调用对象的方法,甚至修改对象的...

    Java反射机制总结

    - **Field类**:表示类的成员变量,包括字段和静态字段。 #### 使用示例 以下是一个简单的Java反射示例,展示了如何使用反射来获取类的信息: ```java import java.lang.reflect.*; public class DumpMethods { ...

    java面试题--反射机制

    `Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    反射之 操作 Field 成员变量类以及反射授权.md

    反射之 操作 Field 成员变量类以及反射授权.md

    java反射-英文版反射规范

    Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    反射实例-JAVA反射机制

    在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...

    java反射.pdf

    Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...

    java反射工具类 ReflectionUtils

    Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...

    java反射源代码

    你可以从Java标准库的`java.lang.reflect`包开始,研究Class、Constructor、Method和Field类的实现。通过阅读源码,可以更深入地理解反射的工作原理,提升编程技巧。 在提供的压缩包文件中,"ework"可能是某个示例...

Global site tag (gtag.js) - Google Analytics