Java 反射机制[Field反射]
1. 反射概念及功能
反射就是把Java类中的各种成分映射成对应的Java类。比如一个Java类中用一个Class类的对象来表示。
一个类中的组成部分分为成员变量,方法,构造方法,包等等。
Java反射机制主要提供了下面功能: 推断在执行时随意一个对象所属的类;在执行时构造随意一个类的对象;推断在执行时随意一个类所具有的成员变量和方法;在执行时调用随意一个对象的方法。生成动态代理。
2. Field反射
下面代码将obj对象中的String类型的字段相应的Value中含有i的字符替换为abc。通过这个简单的案例进行初步分析Java的反射机制。
Java Code
/* * System Abbrev : * system Name : * Component No : * Component Name: * File name :ReflectTestMain.java * Author :Qiuzhenping * Date :2014-10-25 * Description : <description> */ /* Updation record 1: * Updation date : 2014-10-25 * Updator : Qiuzhenping * Trace No: <Trace No> * Updation No: <Updation No> * Updation Content: <List all contents of updation and all methods updated.> */ package com.qiuzhping.reflect.main; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * <Description functions in a word> * 反射就是把Java类中的各种成分映射成对应的Java类。 * <Detail description> * * @author Qiuzhenping * @version [Version NO, 2014-10-25] * @see [Related classes/methods] * @since [product/module version] */ public class ReflectTestMain { /** <default constructor> */ public ReflectTestMain() { // TODO Auto-generated constructor stub } /** <Description functions in a word> * 2014-10-25 * <Detail description> * @author Qiuzhenping * @param args [Parameters description] * @return void [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub //Constructor[] contructor = Person.class.getConstructors(); //Method[] method = Person.class.getMethods(); Person p = new Person(24, "Qiuzhping", "100001", "Qiuzhping"); // Field [] field = p.getClass().getDeclaredFields(); // for(Field f:field){ // f.setAccessible(true); // System.out.println(f.getName()); // Object obj = f.get(p); // System.out.println(obj); // } changeStringValue(p); System.out.println(p.toString()); } /** <Description functions in a word> * 将obj对象中的String类型的字段相应的Value中含有i的字符替换为abc<BR> * 2014-10-26 * <Detail description> * @author Qiuzhenping * @param obj [Parameters description] * @return void [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ private static void changeStringValue(Object obj) throws Exception { Field[] fields = obj.getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true);//暴力反射 if(f.getType() == String.class){//字节码比較是用 == String oldValue = (String) f.get(obj); String newValue = oldValue.replaceAll("i", "abc");//将全部的i替换为abc f.set(obj, newValue); } } } static class Person { public Person(int age, String name, String id, String pwd) { super(); this.age = age; this.name = name; this.id = id; this.pwd = pwd; } @Override public String toString() { return "age = "+age +"\tname = "+name+"\tid = "+id+"\tpwd = "+pwd; } private int age; private String name; private String id; private String pwd; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } /** <default constructor> */ public Person() { // TODO Auto-generated constructor stub } } } |