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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© randee_jia 中级黑马   /  2014-7-23 11:03  /  680 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast.day1;

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

public class ReflectTest {
        //Java类中的每一个成员都解析成一个类
        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");
                System.out.println(cls1==cls2);
                System.out.println(cls2==cls3);
                System.out.println(cls1.isPrimitive());//是否是原始基本类型,共8个基本的数据类型:boolean\byte\char\short\int\long\float\double
                System.out.println(int.class.isPrimitive());
                System.out.println(int.class==Integer.class);
                System.out.println(int.class==Integer.TYPE);//Integer.TYPE获取基本类型
               
                //在Java中任何类型可以用Class类来表示,任何类型在内存中都是一份字节码
                System.out.println(int[].class.isPrimitive());
                System.out.println(int[].class.isArray());//判断是否是数组类型
                //只要是在源程序出现的类型,都有各自的Class实例对象。
                /*
                 * 编译时,jvm知道你要调用构造方法,但不知道调用何种构造方法,只看变量的定义,不看表达式的执行。
                 * 运行时,指定调用何种构造方法
                 */
                Constructor c1=String.class.getConstructor(StringBuffer.class);//选择那个构造方法,根据参数来判断调用那个方法.
                //构造方法的作用是new对象
                String str2=(String)c1.newInstance(new StringBuffer("abc"));//传入何种值构造对象
                System.out.println(str2.charAt(2));
               
               
                ReflectPoint pt1=new ReflectPoint(3,5);
                Field fieldY=pt1.getClass().getField("y");//变量对象,要用它去取某一个对象的值
                System.out.println(fieldY.get(pt1));//获得pt1对象的值
               
                /*Field fieldX=pt1.getClass().getField("x");//变量对象,要用它去取某一个对象的值,只获取公有的属性
                System.out.println(fieldX.get(pt1));//获得pt1对象的值
*/               
                Field fieldX1=pt1.getClass().getDeclaredField("x");//变量对象,要用它去取某一个对象的值,只获取公有的属性
                fieldX1.setAccessible(true);//暴力反射
                System.out.println(fieldX1.get(pt1));//获得pt1对象的值
                //作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”;
                changeStringValue(pt1);
                System.out.println(pt1);
        }
        private static void changeStringValue(Object obj) throws Exception{
                Field[] fields=obj.getClass().getFields();
                for(Field field:fields){
                        //if(field.getType().equal(String.class)),
                        if(field.getType()==String.class){//字节码只有一份
                                String  oldValue=(String)field.get(obj);
                                String newValue=oldValue.replace('b', 'a');
                                field.set(obj, newValue);
                        }
                }
        }
}


0 个回复

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