//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());
}
}
}
}
java反射机制
最新推荐文章于 2023-12-26 00:00:00 发布