黑马程序员技术交流社区

标题: 昨晚看完关于反射的视频,按照自己的理解小结了一下 [打印本页]

作者: zhouyunfang    时间: 2014-11-25 13:53
标题: 昨晚看完关于反射的视频,按照自己的理解小结了一下
反射主要的三个方法1、Constructor   2、Field 3、Method。三个的用法在下边的demo中,不对的地方,大家提出来,希望共勉。
public class Num4 {
        public static void main(String[] args) throws Exception {
                //反射获得字节码的三种方式,三种返回的字节码都是一样的
                String str1 = "12";
                Class cla1 = str1.getClass();
                Class cla2 = String.class;
                Class cla3 = Class.forName("java.lang.String");
                System.out.println(cla1 == cla2);
                System.out.println(cla1 == cla3);
                       
                //利用反射的Constructor构造器来创建类或对象,  new String(new StringBuffer("abc"))
                Constructor constructor  =  String.class.getConstructor(StringBuffer.class);//StringBuffer.class获得类的字节码
                String str = (String)constructor.newInstance(new StringBuffer("abc"));      //需要强制类型转换
                System.out.println(str);
               
                //利用反射的Field来获取成员变量方法
                Person p = new Person();
                Field fy = p.getClass().getField("y");
                System.out.println(fy.get(p));
                Field fx = p.getClass().getDeclaredField("x");//获取私有的变量
                fx.setAccessible(true);    //为true表示获得修改的权限
                System.out.println(fx.get(p));
               
                changStringValue(p);
                Field fy2 = p.getClass().getField("y");
                System.out.println(fy2.get(p));
                       
                //利用反射的Method来获取类中的方法
                Class clas = Num4.class;
                Method add = clas.getMethod("add", new Class[]{int.class,int.class});
                //invoke类的(Object obj,Object args[])方法接受的参数必须为对象
                //如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象
                Object obj = (Object)add.invoke(clas.newInstance(), new Object[]{new Integer(100),new Integer(200)});
                System.out.println(obj);
        }
       
        private static void changStringValue(Object obj) throws Exception {
                Field[] fields = obj.getClass().getFields();
                for(Field field : fields){
                        if(field.getType() == String.class){
                                String oldValue = (String)field.get(obj);
                                String newValue = oldValue.replace("a", "b");
                                field.set(obj, newValue);
                               
                        }
                }
        }
        public int add(int a,int b){
                return a + b;
        }
        public  String abc(String s){
                return s;
        }
}

class Person{
        private String x = "abc";
        public String y = "dddaa";
       
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2