Java的Class类
什么是Class类
- 全名为
java.lang.Class
- 它用来描述一个运行中类的信息,比如这个类的属性,方法等等
- 官方说法是 Java 使用 Class 对象实现 RTTI (运行时类型识别)
- Java 程序的运行过程:
test.java
编译生成 test.class
,test.class
经过类加载器被载入 Java 虚拟机后,生成其对应的 Class 对象
如何获取Class类
classname.class
获取 classname
的 Class 对象,这个方法不属于反射
obj.getClass()
获取 obj
对应的类的 Class 对象
Class.forName(classname)
获取 classname
这个类
- 上面代码对应的输出结果如下,可以看到,forName() 不会触发构造函数
class test
constructed function called...
class test
Class类有什么
- Class 类是用来做什么的?用来描述一个运行中的类
- 一个类里面有什么?属性,方法,构造器......
- Class 类的方法就可以获取一个类的属性,方法,构造器,以及类加载器
Class获取属性
getField(String name)
: 获得某个公有属性
getFields()
: 获得所有公有属性
getDeclaredField(String name)
: 获得某个属性
getDeclaredFields()
: 获得所有属性
public int test.a
[Ljava.lang.reflect.Field;@4b67cf4d
protected int test.b
private int test.c
[Ljava.lang.reflect.Field;@7ea987ac
Class获取方法
getMethod(String name, Class parameterTypes)
: 获得该类某个公有方法
getMethods()
: 获得该类所有公有方法
getDeclaredMethod(String name, Class parameterTypes)
: 获得该类某个方法
getDeclaredMethods()
: 获得该类所有方法
public java.lang.String test.good()
[Ljava.lang.reflect.Method;@4b67cf4d
protected java.lang.String test.hello(int)
private java.lang.String test.bye()
[Ljava.lang.reflect.Method;@7ea987ac
Class实例化类对象
newInstance(Object args)
: 实例化一个类的对象
constructed function called...
Class执行函数
invoke(Object obj, Object args)
: 传递 object 对象及被调用方法的参数
hello function called...
Class获取类加载器
sun.misc.Launcher$AppClassLoader@18b4aac2
Class.forName()
- 这个函数有两种重载
Class<?> forName(String name)
Class<?> forName(String name, **boolean** initialize, ClassLoader loader)
- 即
Class.forName(className)
- 等同于
Class.forName(className, true, currentLoader)
,p牛提到的
- 那么这个
initialize
初始化的是什么?用如下代码做尝试
- 结果如下,可以看到
Class.forName()
在初始化时,初始化的是 static
里的内容
2nd called...
反射
- 即对象可以通过反射获取它的类,类可以通过反射拿到所有方法
- 和反射相关的方法以上内容已经全部包含,下面就是如何利用