zoukankan      html  css  js  c++  java
  • 反射

    一、类的加载

    静态加载

    直接在编写代码时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对象

    如果错过太阳时你流了泪,那你也要错过群星了。
    在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
    不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。
  • 相关阅读:
    C++ 值传递、指针传递、引用传递
    typedef与#define的区别
    const与#define的区别
    头文件重复引用
    多态
    ng双向数据绑定
    angular响应式编程
    angular的一些问题
    npm install 权限的问题
    typescript的入门
  • 原文地址:https://www.cnblogs.com/szrs/p/12156814.html
Copyright © 2011-2022 走看看