初学者毕业设计做网站,个人求职简历模板免费下载,百度信息流广告怎么收费,wordpress所有栏目循环输出文章目录定义classClass获取一个类的类对象反射的具体步骤1.加载类类API2.实例化3.获取1)获取类中方法2)获取构造方法3)获取当前类的属性4.方法调用应用1.遍历对象属性#xff0c;进行赋值定义
反射是操作其属性和方法从编码期决定转为在运行期决定 编码期决定#xff1a;创…
文章目录定义classClass获取一个类的类对象反射的具体步骤1.加载类类API2.实例化3.获取1)获取类中方法2)获取构造方法3)获取当前类的属性4.方法调用应用1.遍历对象属性进行赋值定义
反射是操作其属性和方法从编码期决定转为在运行期决定 编码期决定创建固定类的对象调用这个对象的属性和方法运行期决定灵活创建想要创建的对象参数中传入想要创建对象的字符串再调用这个对象的属性和方法这样做可以提高代码的灵活度适度使用过度使用会降低代码的运行效率增加资源开销。
class
静态属性class在Object中定义所有的类都有这个静态属性。例String.class、int.class
Class
类Class类的每个实例用于表示JVM加载的一个类
获取一个类的类对象
直接调用该类的静态属性class
Class clsString.class;
//但是这样做是在编码期间确定获取某个类的类对象相对不灵活调用Class的静态方法forName
Class clsClass.formName(java.lang.String)通过对象获取该类
Class clsnew User().getClass()通过类加载器ClassLoader
InputStreamgetClass()(或类名.class).getClassLoader().getResourceAsStream(fileName)
//类加载器加载文件默认会从工程的resources文件夹下查找反射的具体步骤
一般分为4步加载类、实例化、获取、调用
1.加载类
Class clsClass.forName(类的全称)
//若指定的类完全限定名有误时会抛出异常:ClassNotFoundException类API
String cls.getName()//类的全称
String cls.getPackage().getName()//包名
String cls.getSimpleName()//类名
String cls.getSuperclass().getSimpleName()//父类//类上所有注解
Annotation[] cls.getAnnotations()
//获取类上指定注解
RequestMapping cls.getAnnotation(RequestMapping.class);2.实例化
Object cls.newInstance()
//例如Test test(Test)Class.forName(com.sgp.Test).newInstance()
//本质是调用其表示的类的无参构造方法进行实例化并将实例化的对象返回也是创建对象的方式之一3.获取
1)获取类中方法
Method[] cls.getMethods()//所有公有方法
Method cls.getMethod(String name, Class?... parameterTypes)//指定公有方法Method[] cls.getDeclaredMethods()//所有方法
Method methodcls.getDeclaredMethod(方法名, null)//指定方法
//例如cls.getDeclaredMethod(sayHi, String.class,int.class)
//第二个参数是可变长参数是指这个方法的几个参数对应的参数类型的class静态属性无参为null或者不写method.getName()//方法名
Params params method.getAnnotation(Params.class)//方法上的注解
Class[] method.getParameterTypes()//方法中参数 //参数个数数组的length2)获取构造方法
Constructor cocls.getConstructor(int.class)//指定构造
Constructor[] concls.getConstructors()//所有构造3)获取当前类的属性
Field[] fieldscls.getFields()//全部公有属性
Field fieldcls.getField(a)//指定公有属性Field[] fields cls.getDeclaredFields()//全部属性
Field field cls.getDeclaredField(code)//指定属性String field.getName()//属性名
String field.getType().getName()//属性类型
Column column field.getAnnotation(Column.class)//属性上的指定注解4.方法调用
获取到属性或方法实例化对象才能调用
属性
int afield.getInt(Object obj)
//obj调用该方法的所属对象调用
Object method.invoke(Object obj, Object... args)
//obj调用该方法的所属对象
//args可变长参数调用该方法传递的实际参数无参方法的调用示例
//实例化类对象
Object objTest.class.newInstance()
//调用
method.invoke(obj)有参方法的调用示例
//实例化类对象
Object objTest.class.newInstance()
//遍历每个方法时获得方法的参数类型
Class[] typesmethod.getParameterTypes()//如果types.length0说明该方法不带参
//创建一个数组用来存放参数值
Object[] paramsnew Object[types.length]
//判断参数类型并往数组中存放值
for(int i0;itypes.length;i){if(types[i]String.class){params[i]hello}if(types[i]int.class) {params[i]100}
}
//执行该方法将装参数的数组作为参数传进去Object method.invoke(obj,params)应用
1.遍历对象属性进行赋值
Class clsobj.getClass();
Field[] fields cls.getDeclaredFields();
for(Field field:fields){String fieldNamefield.getName();//排除附加字段if(fieldName.contains(serialVersionUID) || fieldName.contains(create) || fieldName.contains(update)){continue;}//set、get时属性首字母大写fieldName(fieldName.substring(0,1).toUpperCase())fieldName.substring(1);//调用get方法Method getMethod cls.getMethod(getfieldName);//获取属性的类型String type field.getGenericType().toString();//如果type是类类型则前面包含class 后面跟类名if(type.equals(class java.lang.String)){String value (String) getMethod.invoke(obj);if(valuenull){continue;}if(value.equalsIgnoreCase(N/A)){//执行set方法Method setMethod cls.getMethod(setfieldName,new Class[] {String.class});setMethod.invoke(obj,new Object[] {null});}}
}