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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

反射主要的三个方法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";
       
}

评分

参与人数 1技术分 +1 收起 理由
船长 + 1 多多总结,就有收获,赞一个!.

查看全部评分

0 个回复

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