原文出处:http://eeelin.iteye.com/blog/533658
java 反射 Field类
-------用到一个bean
- package com.ncs;
- public class Point {
- private int x;
- public int y;
- public Point(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
- }
--------------------
- package com.ncs;
- import java.lang.reflect.Field;
- //need another bean Point
- public class ReflectTest {
- //★这里说的Field都是 类 身上的,不是实例上的
- public static void main(String[] args) throws Exception {
- Point pt1 = new Point(3,5);
- //得到一个字段
- Field fieldY = pt1.getClass().getField("y"); //y 是变量名
- //fieldY的值是5么?? 大错特错
- //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊
- //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值
- //要这样
- System.out.println(fieldY.get(pt1)); //这才是5
- //现在要x了
- /*
- Field fieldX = pt1.getClass().getField("x"); //x 是变量名
- System.out.println(fieldX.get(pt1));
- */
- //运行 报错 私有的,找不到
- //NoSuchFieldException
- //说明getField 只可以得到 公有的
- //怎么得到私有的呢??
- /*
- Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
- //然后轮到这里错了
- // java.lang.IllegalAccessException:
- //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private"
- System.out.println(fieldX.get(pt1));
- */
- //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用 三是暴力抢了
- //暴力反射
- Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
- fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
- System.out.println(fieldX.get(pt1));
- //out 3 OK!!
- }
- }
---------------------------下面做的小实验,把一个类里所有String类型的字段里的值 b 变 a
- package com.ncs;
- public class Point {
- private int x;
- public int y;
- public String s1 ="ball";
- public String s2="hubin";
- public String s3="zhangxiaoxiang";
- //做实验而已,字段不可能是 public 的
- public Point(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
- }
----------------------------
- package com.ncs;
- import java.lang.reflect.Field;
- //need another bean Point
- public class ReflectTest {
- public static void main(String[] args) throws Exception {
- Point pt1 = new Point(3,5);
- //get all fields
- Field[] fields = pt1.getClass().getFields();
- for(Field field : fields ) {
- //我说的是String 类型的字段,当然要选择一下
- //if(field.getType().equals(String.class)) {
- //字节码都是一份的,干什么用equals啊
- if(field.getType()== String.class) {
- String oldValue = (String)field.get(pt1);
- String newValue = oldValue.replace('b', 'a');
- //改 对象的字段
- field.set(pt1, newValue);
- }
- }
- System.out.println(pt1.s1);
- System.out.println(pt1.s2);
- System.out.println(pt1.s3);
- //aall
- //huain
- //zhangxiaoxiang
- }
- }
总结:获取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(),
这里还用到了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类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...
### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...
### Java反射机制之Field组件详解 #### 一、引言 在Java开发中,反射机制是一种非常强大的工具,它能够让我们在运行时获取类的信息并操纵对象的状态。Field作为Java反射机制的重要组成部分之一,主要用于获取类中...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...
本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...
总结,Java反射机制为我们提供了强大的动态性,能够方便地获取和操作类的属性和方法,包括私有成员和子类父类中的成员。通过熟练掌握反射技术,开发者可以实现更灵活、更动态的代码,但也需要谨慎使用,以避免潜在的...
Java反射是Java编程语言中的一个重要特性,它允许运行时访问和操作类、接口、字段和方法等信息。在Java中,反射提供了动态类型的能力,使我们可以在程序运行时检查类的信息,创建和调用对象的方法,甚至修改对象的...
- **Field类**:表示类的成员变量,包括字段和静态字段。 #### 使用示例 以下是一个简单的Java反射示例,展示了如何使用反射来获取类的信息: ```java import java.lang.reflect.*; public class DumpMethods { ...
`Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...
反射之 操作 Field 成员变量类以及反射授权.md
Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...
Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...
Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...
你可以从Java标准库的`java.lang.reflect`包开始,研究Class、Constructor、Method和Field类的实现。通过阅读源码,可以更深入地理解反射的工作原理,提升编程技巧。 在提供的压缩包文件中,"ework"可能是某个示例...