反射与class类

内容学习于:edu.aliyun.com


1. 认识反射机制

  Java语言里面最为重要的特性之一就是反射机制了,正是因为反射机制的存在,才可以使得Java设计更加的灵活,如果你本身是一个完全不懂得反射编程的开发人员,那么你永远写不出高复用的代码,几乎所有Java中的开发框架全部都属于反射的应用实现的。既然要进行反射的讲解,那么首先就需要通过“反”来进行说明。
  常规的做法是明确的知道了一个类之后,导入此类随后进行对象实例化处理,但是反射可以依据实例化对象找到其根源,在Object类中提供有一个getClass()方法: public final Class<?> getClass()。
  如下图所示:在这里插入图片描述

反射基本操作:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
       Class<?> clsA = new java.util.Date().getClass();
        System.out.println(clsA);
        System.out.println(clsA.getName());
        System.out.println(clsA.getSimpleName());
    }
}

结果:

class java.util.Date
java.util.Date
Date

  如果直接输出了Class类的对象,那么就会获得该类型的详细描述。而如果通过了getName()方法获得输出会输出对象所在类的完整名称(包.类名称),通过getSimpleName()只是获取了类名称。

2. 获取Class类对象实例

  反射的根源是Class类,但是在Java里面对于Class 类对象的实例化操作提供有三类支持:

  • 第一种操作:利用Object类中提供的getClass()方法, 通过实例化对象调用获得;
  • 第二种操作:利用“类.class”的Java原生代码操作实现:
  • 第三种操作:利用Class类中提供的方法进行实例化。

  除了给定的原生支持之外,在Class类的内部还提供有一个forName(方法,利用此方法可以实现Class的实例化,方法定义:

  • public static Class<?> forName(String className) throws ClassNotFoundException

  此类方法需要将加载反射类型的名称进行定义,而且定义的时候要求使用类的完整名称“包.类”,如果该类不存在则会出现“ClassNotFoundException”, 也就意味着要进行加载的类一定要放在CLASSPATH可以识别的路径之中。

三种方式操作:

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
       Class<?> clsA = new java.util.Date().getClass();//第一种方法
       Class<?> clsB = java.util.Date.class;//第二种方法
       Class<?> clsC = Class.forName("java.util.Date");//第三种方法
        System.out.println(clsA);
        System.out.println(clsB.getName());
        System.out.println(clsC.getSimpleName());
    }
}

结果:

class java.util.Date
java.util.Date
Date

  此时通过三种形式可以获取Class类的实例,这三种形式的特点"一定要掌握:
  getClass():需要明确的获得使用类的实例化对象;
  类.class:需要明确的进行操作类的导入处理;
  Class.forName(): 可以通过字符串描述要使用类的名称。

发布了43 篇原创文章 · 获赞 13 · 访问量 2635

猜你喜欢

转载自blog.csdn.net/qq_43040688/article/details/104161538