反射
一、类的加载
静态加载
直接在编写代码时new一个类的对象,要求该类是存在的,不然编写时就报错;
动态加载
通过类的反射机制,动态加载类的信息,并获得类的属性(类名,修饰符),类中的方法,属性等信息。在程序运行时,才加载该类,若该类不存在,会报异常。
二、反射
1、定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
2、Class类
Class代表类的实体,在运行的Java应用程序中表示类和接口。想要通过java中的反射机制来使用一个类,就必须要得到该类的Class对象。
2.1 获取类的Class对象有三种方法
//1
Person p=new Person; Class<?> calzz=p.getClass();
//2 Class clazz=Class.forName("com.bjsxt.demo.Person");
//3
Class clazz=Person.class;
3、获取类的信息
3.1 类
3.1.1 对类名进行反射
Class clazz = 类.class; String className = clazz.getName(); //完全限定类名(包括包名) String className = clazz.getCanonicaName(); //完全限定类名(包括包名) String className = clazz.getSimpleName(); //获取不含包名的类名
3.1.2对类修饰符进行反射
Class clazz = 类.class; int modifieers = clazz.getModifiers(); //得到类的修饰符是数字型 System.out.println(Modifier.toString(modifieers)); // Modifier.toString(); 该方法用来将数字型转换成修饰符
//数字对应的修饰符为:
0 什么也没有(默认)
1 public
2 private
4 protected
8 static
16 final
32 synchronized
64 volatile
128 transient
256 native
512 interface
1024 abstract
2048 strictfp
3.2 获取类的属性
3.2.1 对属性进行反射
Class clazz = 类.Class; Field[] fields = clazz.getFields(); //该方法功能得到本类中的所有公共属性,包括所有继承的公共属性 Field[] fields = clazz.getDeclaredFields(); //该方法用于得到本类中所有的属性(一般使用较多)
3.2.2 对属性修饰符进行反射
Class clazz = 类.Class; Field[] fields = clazz.getDeclaredFields(); for(Field field: fields){ //遍历输出属性名 sysotem.out.println(field.getName()); //field.getName()该方法用于得到属性名 //遍历输出属性的修饰符用数字进行表示 sysotem.out.println(field.getModifiers()); //field.getModifiers()用于获取所有用数字表示的修饰符 //遍历输出属性的修饰符 sysotem.out.println("修饰符:"+Modifier.toString(field.getModifiers())); //Modifier.toString()方法用来将数字表示的修饰符,转换成真正的修饰符。toString()中参数为int类型。 }
3.3 方法
3.3.1 对方法进行反射
Class clazz = Studet.class; //对Student类中的方法进行反射 Methd[] methods = clazz.getMethods(); //clazz.getMethods();该方法功能得到本类中的所有公共方法,包括所有继承的公共方法 //如果Studet类中没有方法,则将父类(Object)中的public修饰的方法名显示出来。 Methd[] methods = clazz.getDeclaredlMethods(); //clazz.getDeclaredlMethods();该方法用于得到本类中所有的方法(一般使用较多)
3.3.2 对方法的修饰符进行反射
Student student = new Student(); Class clazz = student.getClass(); //对Student类中的方法进行反射 try{ //Methd[] methods = clazz.getMethods(); Methd[] methods = clazz.getDeclaredlMethods(); for(Method method : methods) { system.out.println(method.getModifiers()); //method.getModifiers()用于获取所有用数字表示的修饰符 //Modifier.toString(); 方法用来将数字表示的修饰符,转换成真正的修饰符。toString()中参数为int类型。 system.out.println(Modifier.toString(method.getModifiers())); } }catch(Exception e){ e.printstackTrace(); }
4、使用
4.1获取泛型类的class对象
4.2项目中的使用
1、反射工具类;
2、通过反射获取自定义注解,编写导入导出工具类。
如果错过太阳时你流了泪,那你也要错过群星了。
在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。
在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。