反射与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 类对象的实例化操作提供有三类支持:
- <mark>第一种操作:利用Object类中提供的getClass()方法, 通过实例化对象调用获得;</mark>
- <mark>第二种操作:利用“类.class”的Java原生代码操作实现:</mark>
- <mark>第三种操作:利用Class类中提供的方法进行实例化。</mark>
除了给定的原生支持之外,在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(): 可以通过字符串描述要使用类的名称。