反射

一、类的加载

静态加载

直接在编写代码时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、通过反射获取自定义注解,编写导入导出工具类。

 

posted @ 2020-01-08 16:48  慎终若始  阅读(126)  评论(0编辑  收藏  举报