zoukankan      html  css  js  c++  java
  • 对于反射的一些总结(一)

    1.  Class类:  

    1.1.   关于 Class 类的概述:    

            我们要了解反射,首先就要了解 Class 这个类。接下来就先来了解一下Class类吧!

            Class 类的实例表示一个正在运行的 Java 应用程序的类和接口。例如:枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 类型的实例(对象)创建的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

            Class 没有公共构造方法。Class 对象是在类加载时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的我们可以通过这个Class 类型的对象来进行得到一些信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。

    对于上面说这么多总结而言,就是下面的几句话:

      对于每个类而言:

        ①  、JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。

        ②  、Class 对象只能由系统建立对象。

        ③  、一个类在 JVM 中只会有一个Class实例 每个类的实例都会记得自己是由哪个 Class 实例所生成。

    1.2.   关于 Class 类中的方法:

      1.   如何获取Class类的实例,可以通过三种方式来进行获取!

         ①、通过 class 属性来进行获取 Class 类对象,该方法最为安全可靠,程序性能更高。

           如 :Class clzz = String.class

         ②、通过对象的getClass()来进行获取 Class类对象。这种方式最为少用。

               如:String str = new String(); Class clazz = str.getClass();

         ③、通过 Class 类的静态方法 forName() 来进行获取 Class类对象。这种方式最为常用。

               如 :Class clazz = Class.forName(“java.lang.String”);

        Class类的常用方法

    方法名

    功能说明

    static Class forName(String name)

    返回指定类名 name 的 Class 对象

    Object newInstance()

    调用缺省构造函数,返回该Class对象的一个对象(实例)

    Object newInstance(Object []args)

    调用当前格式构造函数,返回该Class对象的一个对象(实例)

    getName()

    返回此Class对象所表示的实体

    (类、接口、数组类、基本类型或void)名称

    Class getSuperClass()

    返回当前Class对象的父类的Class对象

    Class [] getInterfaces()

    获取当前Class对象的接口

    ClassLoader getClassLoader()

    返回该类的类加载器

    Class getSuperclass()

    返回表示此Class所表示的实体的超类的Class

    1.3.   什么是类加载器(ClassLoader)?

           类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

         

      相关代码:   

     1  public void getClassLoaderName() {
     2 
     3        // 获取一个系统类加载。(这里是获取的是当前类的类加载器)。
     4 
     5     ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
     6 
     7     System.out.println(systemClassLoader);
     8 
     9        // 获取一个系统类加载的父类加载器扩展类加载器。
    10 
    11     ClassLoader extensionClassLoader = systemClassLoader.getParent();
    12 
    13     System.out.println(extensionClassLoader);
    14 
    15         // 获取一个扩展类加载器的父类加载器引导类加载器。
    16 
    17     ClassLoader classLoader = extensionClassLoader.getParent();
    18 
    19     System.out.println(classLoader);
    20 
    21     }
    View Code

    调用该方法后的执行结果:

     

      通过系统类加载器获取 classpath 下的资源:

      InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");

      System.out.println(in);

    那么接下来就来说一下反射(Reflection)参见地址 http://www.cnblogs.com/Vincent-NMT/p/6083106.html中的内容。

  • 相关阅读:
    BZOJ 4408: [Fjoi 2016]神秘数
    51Nod 1317 相似字符串对
    51Nod 1561 另一种括号序列
    BZOJ 4556: [Tjoi2016&Heoi2016]字符串
    51Nod 1048 整数分解为2的幂 V2
    BZOJ 4698: Sdoi2008 Sandy的卡片
    BZOJ 3571: [Hnoi2014]画框
    BZOJ 2752: [HAOI2012]高速公路(road)
    BZOJ 1095: [ZJOI2007]Hide 捉迷藏
    BZOJ 4537: [Hnoi2016]最小公倍数
  • 原文地址:https://www.cnblogs.com/Vincent-NMT/p/6083089.html
Copyright © 2011-2022 走看看