-------android培训、java培训、期待与您交流! ----------
Class<T>类是整个Java语言的核心.
Java语言要实现" everything is object"这样的豪言, 没有Class<T>类的支持是不可能达到的.
Class<T>类的重要意义是: 将类型看到一种对象. Class<T>就是这种类类型
这也是反射的本质.
所谓反射, 实际上是对 某一个类型 进行剖析.
基于Class<T>类型的重要性, 所以我花了不少时间研究了它的API接口, 其笔记如下:
---------------------------------------------------------------------------------------
构造方法----private的----外界不能用的:
private Class() {}
常见方法: -----仅举这几个, 很多不多说了.
获取 Class对象---static方法
static Class<?>
forName(
String className)
static Class<?>
forName(
String name,
boolean initialize,
ClassLoader loader)
String className: 必须是完整的类名,如:java.lang.String
ClassLoader loader: 可指定 加载器 来加载这个类.
如果, 为null的话, 则用bootstrap来加载的.
boolean initialize:
如果此类还未被初始化的话, 是否现在就初始化.
注意:
Class.forName("Foo") 等价于:
Class.forName("Foo", true, this.getClass().getClassLoader())
即, 用当前类的加载器来加载这个Foo,
而且, 执行这个forname方法是, 就进很初始化.
-----其实, 我现在还是不明白什么是 initialize. 以下只是我个人的一个猜测:
true: 在调用这个方法, 告知JVM此类的加载器为何, 并同时就进行是加载.
false: 调用这个方法时, 告知JVM此类的加载器为何, 但不进行加载.
获得---类加载器----相关的东西
ClassLoader
getClassLoader()
返回该类的类加载器。
在调用这个方法时, 此类早
已被加载
进去了.
只是, 我们想知道加载这个类的加载器是哪一个而已.
如果是bootstrap, 会返回null.
这个具体的内容在 类加载器 一节中有具体的介绍.
URL
getResource(String name)
InputStream
getResourceAsStream(
String name)
是如下这个句子的简化:
this.getClassLoader().getResourceAsStream(name)
参见
28.用类加载器的方式管理资源和配置文件 一节.
总之,
ClassLoad可以加载.class文件,
当然, 其也可以把普通的文件变成InputStream了.
比如, 把
配置文件/资源文件 读入内存.
如果用 普通的FileInputStream这种, 其路径写起来麻烦,
而 this.getClassLoader().getResourceAsStream(name)
填的路径, 很简单, 相对于classpath的.
而 Class::getResourceAsStream更简单了,
直接相对于当前这个.class文件的目录了.
不过, 用这种方法有缺点,
缺点是, 只能读, 不能写.
因为只有InputStream, 但没有OutputStream啊.
但, 通常放在.class文件目录中的配置文件,
显然也只是为了读而已, 不希望别人来改它.
获得---所在包
Package
getPackage()
返回Package对象.
Package类型要注意下.
获取---类的注释标记
<A extends Annotation> A
getAnnotation(Class<A> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
注意, 这里泛型的写法.
(其也会把父类上的注释也返回)
注意:
参数是 Class类型.
Annotation[]
getAnnotations()
返回此元素上存在的所有注释。
(其也会把父类上的注释也返回)
<A extends Annotation> A
getAnnotation(Class<A> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
(其也会把父类上的注释不返回)
注意:
参数是 Class类型.
Annotation[]
getDeclaredAnnotations()