A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© xiaoxinxin003 中级黑马   /  2015-7-7 00:58  /  392 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package classString;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;


public class ReflectDemo {

        public static void main(String[] args) throws Exception {
                String str1 = "abc";
                // 一、三种获取字节码的方式
                Class cls1 = str1.getClass();
                Class cls2 = String.class;
                Class cls3 = Class.forName("java.lang.String");
               
                //cls1  cls2 cls3  都是Class的对象,它们应该是相等的
                System.out.println(cls1 == cls2);
                System.out.println(cls1 == cls3);//都是返回true
               
                //二、判断是否是基本类型方法isPrimitive();以cls1为例
                //String类型不是基本类型,返回false,int类型返回true
                System.out.println(cls1.isPrimitive());//返回false
                System.out.println(int.class.isPrimitive());//返回true
                //再看看int类型的数组是不是基本类型
                System.out.println(int[].class.isPrimitive());//同样返回了false
                System.out.println(int[].class.isArray());//返回true
               
                //三、构造方法的反射应用
                /*
                 * 获取构造方法有两种情况:获取所有和获取单个,下面依次演示
                 * */
                //获取所有
                //Constructor [] constructors1 = Class.forName("java.lang.String").getConstructors();
                //获取单个(需要传递参数类型以示获取对应的构造方法)
                Constructor constructor1 = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
                //下面就以获取单个构造方法为例演示实例化以及参数传递
                /*
                 * 创建实例对象的通常方式为
                 * String str = new String(new StringBuffer("abc"));
                 * 下面是反射方式的实例对象创建过程以及参数传递
                 * */
                String str2 = (String) constructor1.newInstance(new StringBuffer("abc"));
                System.out.println(str2.charAt(2));//索引地址值2并打印
               
               
                //四、成员变量的反射应用
                /*
                 * 成员变量份公有和私有,引入一个类Field,代表某个类中的某一个成员变量
                 * 代码演示反射获取成员变量的方法
                 * */
                //公有成员变量获取
                ReflectPoint1 pt1 = new ReflectPoint1(3, 5);
                //fieldY只是Field的一个对象,指向了“y”,但还没有具体值
                Field fieldY = pt1.getClass().getField("y");
                //获取y的具体值并打印,需要制定具体对象pt1
                System.out.println(fieldY.get(pt1));//5
               
                //第2种、暴力反射(强行获取私有成员变量)
                //使私有成员变量可见
                Field fieldX = pt1.getClass().getDeclaredField("x");
                //使私有成员可取
                fieldX.setAccessible(true);
                //取值并打印
                System.out.println(fieldX.get(pt1));//3
               
                //五、代码演示修改某一类型所有成员的参数
                /*
                 * 步骤:
                 * 1.首先获取所有字段
                 * 2.在这些字段中筛选出某一类型(如String)
                 * 3.修改保存并打印
                 * */
                changeStringValue(pt1);
                System.out.println(pt1);//aall****aasketaall******itcast
               
               
               
               
        }

        private static void changeStringValue(Object obj)throws Exception {
                /*
                 * 步骤:
                 * 1.首先获取所有字段
                 * 2.在这些字段中筛选出某一类型(如String)
                 * 3.修改保存并打印
                 * */
                Field [] fields = obj.getClass().getFields();
               
                for(Field field : fields)
                {
                        if(field.getType() == String.class)
                        {
                                String oldValue = (String)field.get(obj);
                                String newValue = oldValue.replace("b", "a");
                                                field.set(obj, newValue);
                        }
                }
        }

}

不足之处,请多指教。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马