java反射机制

//JAVA反射机制主要指的是程序可以检测修改它本身状态或者行为的机能
//反射是在运行过程中 对任意一个类获知其属性 属性值 以及方法并掉用这个方法 举个栗子 遍历对象属性属性值
//简单的举个栗子  
//创建一个简单的表实体类  eg public static Users 
//以下是简单的反射方法

public static void getProperty() throws Exception {

//Class.forName(className); 获取对象类型 返回值是对象类
//象或者实例化其他属性的方法!
//或者可以理解成讲对象虚拟成一种类型形式 此类型形式包括该对
//象的各种属性和方法 该类型也可以反方向实例化该对象 该处和反射有//关系 因为可以通过反射实例化对对象 而不再是new方法实例化对象
//用反射的方法就是通过构造方法来实例化对象 栗子在下面
    Class<?> classType=Class.forName("com.cissst.entity.Users");
    //?代表任意类型
    //此处会抛出异常 一般来说try方法比throws方法好
    //获取对象类型中的所有属性 返回值是Field 的数组类型
    Field fields[] = classType.getDeclearedFields();
    // Method[] methods=classType.getMethods();//拿到函数成员
    //导入的包是java.lang.reflect.
    //getDeclearedFields 获取的是private portect public 类型的
    //getFields 获取的是public类型的

     for(int i=0;i<fields.length;i++){
        Field field = fields[i];
    //获得属性的名称
        String fieldName = field.getName();
    //    String type = field[i].getGenericType().toString();  获取属性的类型
    //从第几位开始到第几位的截取字符,并且包括前面不包括后面的
    //写在外面的小尾巴  String 其实封装的是char [] {"a","b","c","d"} 并且存在下标的
    //讲属性第一个字母截取并且大写化
    //此处的又截取字母又大写化是因为在设定属性值是存在小写 当然如果全部首字母大写就不会这么麻烦了
        String firstLetter = fieldName.substring(0,1).toUpperCase();
    //获取get方法名
        String getMethodName = "get"+firstLetter+fieldName.substring(1);
    //获取set方法名
        String setMethodName = "set"+firstLetter+fieldName.substring(1);
    //获取方法要使用对象来获取  classTyoe。getMethod(name,parameterypes);
    //name 方法名 parameterTypes 参数类型 
    //写在外面的小猪悟能 此处的parameterTypes是一个复数 且是一个classTyoe的复数
    //所以此处的parameterTypes必须一个是classType的数组类型
    //同时因为getter方法没有传入参数 所以此处是一个空数组 因为getter方法是很多属性的getter方法!
        Method getMethod = classType.getMethod(getMethod,new Class[]{});
    //getType()获取当前对象的属性类型
    //写在外面的小尾巴 此处的getTyoe()可以等价于String.class 但是对于int类型 不可以作为对象来使用
    //所以要使用int的封装类 Integer.class 这样 java八大属性
    //类型 都不可以作为对象使用 需要使用包装类
        Method setMethod = classTyoe.getMethod(setMethod,new Class[]{field.getType()});
    //invoke(object,args); 执行方法
    //classType.getConstructor(parameterTypes).newInsta//nce(initargs);此处反射的方法是通过构造方法来构造对象并且将其
//实例化 这样就需要在表实体类中构造带参数的构造方法和无参的构造方
//法  parameterTypes 参数类型 无参数new Class[]{}即可 有参
//数的话就就传入参数
    //newInstance(initargs)就是构建实例化一个对象 无参数时
    //new Object[]{}即可
    //此处可以看成对象的初始化
    //new Class[]{}对应的是属性类型
    //new Object[]{}对应的是属性的值
    //如果要是传值
    //setMethod.invoke(classType.getConstructor(new Class[]{String.class}).newInstance(new Object[]{"timoRun"}));
        Object obj = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
        Object value = getMethod.invoke(obj,new Object[]{});
        setMethod.invoke(obj,new Object[]{value})

        //上下是获取属性值的两种方法

        Method m = classType.getClass().getMethod("get"+name);
        String value = (String) m.invoke(classType);    //调用getter方法获取属性值

     }

}
//========================
写在后面的尾巴  此处作参考 我也不知道干嘛的
 if(type.equals("class java.lang.String")){   //如果type是类类型,则前面包含"class ",后面跟类名
      Method m = model.getClass().getMethod("get"+name);
      String value = (String) m.invoke(model);    //调用getter方法获取属性值
         if(value != null){

   System.out.println("attribute value:"+value);
                    }
                }
//另附一个小栗子

public static void testReflect(Object model) throws 
NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Field[] field = model.getClass().getDeclaredFields();        //获取实体类的所有属性,返回Field数组  
        for(int j=0 ; j<field.length ; j++){     //遍历所有属性
                String name = field[j].getName();    //获取属性的名字

                System.out.println("attribute name:"+name);     
                name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法
                String type = field[j].getGenericType().toString();    //获取属性的类型
                if(type.equals("class java.lang.String")){   //如果type是类类型,则前面包含"class ",后面跟类名
                    Method m = model.getClass().getMethod("get"+name);
                    String value = (String) m.invoke(model);    //调用getter方法获取属性值
                    if(value != null){

                        System.out.println("attribute value:"+value);
                    }
                }
                if(type.equals("class java.lang.Integer")){     
                    Method m = model.getClass().getMethod("get"+name);
                    Integer value = (Integer) m.invoke(model);
                    if(value != null){
                        System.out.println("attribute value:"+value);
                    }
                }
                if(type.equals("class java.lang.Short")){     
                    Method m = model.getClass().getMethod("get"+name);
                    Short value = (Short) m.invoke(model);
                    if(value != null){
                        System.out.println("attribute value:"+value);                    }
                }       
                if(type.equals("class java.lang.Double")){     
                    Method m = model.getClass().getMethod("get"+name);
                    Double value = (Double) m.invoke(model);
                    if(value != null){                    
                        System.out.println("attribute value:"+value);  
                    }
                }                  
                if(type.equals("class java.lang.Boolean")){
                    Method m = model.getClass().getMethod("get"+name);    
                    Boolean value = (Boolean) m.invoke(model);
                    if(value != null){                      
                        System.out.println("attribute value:"+value);
                    }
                }
                if(type.equals("class java.util.Date")){
                    Method m = model.getClass().getMethod("get"+name);                    
                    Date value = (Date) m.invoke(model);
                    if(value != null){
                        System.out.println("attribute value:"+value.toLocaleString());
                    }
                }                
            }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值