ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

十四.java反射机制

2020-05-01 19:57:03  阅读:232  来源: 互联网

标签:反射 java getName System Student println 十四 Class out


1.反射是Java提供的一种运行机制,代码运行时动态的获取一个类型的各种信息,以及相关的一系列操作

  Java中每一种类型,都有且仅有一个Class对象与之对应,每种类型在进行类加载之后,JVM会在内存中自动生成一个Class类型对象

  Student.java---->Student.class--->类加载--->成功----->内存中产生Class类型对象

2.反射中重要的类和包:反射机制中的常见类的含义

  java.lang包下:
    Class 类 对java中所有类型抽象而得来的
    package类 对java中所有包抽象而得来的

  java.lang.reflect包下:
    Modifier 类 对java中所有修饰符抽象而得来的
    Field 类 对java中所有属性抽象而得来的
    Method 类 对java中所有方法抽象而得来的
    Constructor 类 对java中所有构造器抽象而得来的
    Array 类 提供了对数组对象的动态访问
    ParameterizedType 接口 在反射中表示参数化类型
      例如:List<String> Point<Long,Long>等这种带泛型的类型

3.获得一个类类型的Class对象的三种方式

  以上几种情况中,所以最多的还是类类型的Class对象

    1.使用对象调用getClass方法获得
      getClass是Object中的final修饰的方法,每个对象都可以调用而且不能重写
      Student s = new Student();
      Class c = s.getClass();

    2.使用类名获得
      Class c = Student.class;

    3.使用Class类中的forName方法获得
      //这种方法很灵活,只需一个String类型参数即可
      //而String类型的数据改变起来很容易
      //注意该方法是会抛出异常的
      Class c = Class.forName("com.briup.test.Student");

    注:以上三种方法获得的同一个对象(==比较),因为每个类型内存都有且只有一个Class类型对象

4.创建任意类的对象

  public Object test(String className){
    Class<?> c=Class.forName(className);
    Object obj = c.newInstance();
    return obj;
  }

  注:在开发中要保证无参构造器的存在,否则在反射的时候会很麻烦。

5.使用Class类型对象获得类中的信息

  1.获得该类所处的包的信息
    Student s = new Student();
    Class c = s.getClass();
    System.out.println(c.getPackage().getName());

  2.获得该类的修饰符信息
    //每个修饰符对应一个int值
    //如果有多个修饰符则int值相加
    Student s = new Student();
    Class c = s.getClass();
    System.out.println(c.getModifiers());

    这里涉及到Modifier这个类,这个类中定义了一系列的修饰符所对应的值

  3.获得该类的全限定类名
    Student s = new Student();
    Class c = s.getClass();
    System.out.println(c.getName());

  4.获得该类的父类的Class对象

    Student s = new Student();
    Class c = s.getClass();
    //superclass表示其父类型的Class对象
    Class superclass = c.getSuperclass();
    System.out.println(superclass.getName());

    例如:
      Class c = Object.class;
      Class superclass = c.getSuperclass();
      System.out.println(superclass.getName());
      //运行报错,因为Object没有父类

    例如:
      //判断c1是不是c2的子类型
      //判断c3是不是c2的子类型
      Class c1 = Student.class;
      Class c2 = Person.class;
      Class c3 = String.class
      System.out.println(c2.isAssignableFrom(c1));//true
      System.out.println(c2.isAssignableFrom(c3));//false

  5.获得该类所实现的接口类型的Class对象

    Student s = new Student();
    Class c = s.getClass();
    Class[] interfaces = c.getInterfaces();
    for(Class clazz:interfaces){
      System.out.println(clazz.getName());
    }
    例如:
      //判断c1是不是c2的实现类
      //判断c3是不是c2的实现类
      Class c1 = Student.class;
      Class c2 = Action.class;
      Class c3 = String.class
      System.out.println(c2.isAssignableFrom(c1));//true
      System.out.println(c2.isAssignableFrom(c3));//false

  6.获得该类中所有的属性

    Student s = new Student();
    Class c = s.getClass();
    Field[] declaredFields = c.getDeclaredFields();
    for(Field f:declaredFields){
      System.out.println(f.getModifiers());
      System.out.println(f.getType().getName());
      System.out.println(f.getName());
    }
    注:
      getDeclaredFields()方法返回类中声明的属性,包括私有的
      getFields()方法只返回类中public修饰的属性,包括继承的
    例如:
      //获得某个指定的属性(也包括私有属性)
      Student s = new Student();
      Class c = s.getClass();
      Field f = c.getDeclaredField("score");
      System.out.println(f.getModifiers());
      System.out.println(f.getType().getName());
      System.out.println(f.getName());

  7.获得该类中所有的方法

    Student s = new Student();
    Class c = s.getClass();
    Method[] declaredMethods = c.getDeclaredMethods();
    for(Method m:declaredMethods){
      System.out.println(m.getModifiers());
      System.out.println(m.getReturnType().getName());
      System.out.println(m.getName());
      System.out.println(Arrays.toString(m.getParameterTypes()));
      System.out.println(Arrays.toString(m.getExceptionTypes()));
    }

    注:
      getDeclaredMethods()方法返回类中声明的方法,包括私有的
      getMethods()方法只返回类中public修饰的方法,包括继承的

    例如:
      //获得某个指定的方法(也包括私有方法)
      Student s = new Student();
      Class c = s.getClass();
      Method m = c.getDeclaredMethod("print");
      System.out.println(m.getModifiers());
      System.out.println(m.getReturnType().getName());
      System.out.println(m.getName());
      System.out.println(Arrays.toString(m.getParameterTypes()));
      System.out.println(Arrays.toString(m.getExceptionTypes()));

    注:反射重载方法会报出:java.lang.NoSuchMethodException: java.lang.String.valueOf()

  8.获得该类中所有的构造器

    Student s = new Student();
    Class c = s.getClass();
    Constructor[] declaredConstructors = c.getDeclaredConstructors();
    for(Constructor con:declaredConstructors){
      System.out.println(con.getModifiers());
      System.out.println(con.getName());
      System.out.println(Arrays.toString(con.getParameterTypes()));
      System.out.println(Arrays.toString(con.getExceptionTypes()));
    }

    注:
      getDeclaredConstructors()方法返回类中所有构造器
      getConstructors()方法只返回类中public修饰的构造器

    例如:
      //获得某个指定的构造器(也包括私有构造器)
      Student s = new Student();
      Class c = s.getClass();
      Constructor con = c.getDeclaredConstructor(double.class);
      System.out.println(con.getModifiers());
      System.out.println(con.getName());
      System.out.println(Arrays.toString(con.getParameterTypes()));
      System.out.println(Arrays.toString(con.getExceptionTypes()));

  9.获得父类型中的泛型的真实类型:麻烦 略……

  10.获得类中的注解:使用反射也可以获得类中的注解,我在开发时没用过,略……

标签:反射,java,getName,System,Student,println,十四,Class,out
来源: https://www.cnblogs.com/Magic-Li/p/12813537.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有