Class类
–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
–Class 对象只能由系统建立对象
–一个类在 JVM 中只会有一个Class实例
–每个类的实例都会记得自己是由哪个 Class 实例所生成.
Class是什么?
Class是一个类:
public class ReflectionTest {
@Test
public void testClass() {
Class clazz = null;
}
}
//Class的定义
public final
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
.....
.....
.....
}
//小写class表示是一个类类型,大写Class表示这个类的名称
Class这个类封装了什么信息?
Class是一个类,封装了当前对象所对应的类的信息
一个类中有属性,方法,构造器等,比如说有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是Class,它应该有类名,属性,方法,构造器等。Class是用来描述类的类
Class类是一个对象照镜子的结果,对象可以看到自己有哪些属性,方法,构造器,实现了哪些接口等等
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例
获取Class对象的三种方式
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
java类加载器
- 启动类加载器(Bootstrap ClassLoader)
- 扩展类加载器(Extension ClassLoader)
- 系统类加载器(Application ClassLoader)
- 自定义加载器
ClassLoader作用:
1. 将Class加载到JVM中
2. 审查每个类由谁加载。
3. 将Class字节码重新解析成JVM统一要求的数据格式。
三个机制
- 委托性:双亲委派模型
- 可见性:子类加载器可以看见所有父类加载器的类,父类加载器看不到子类加载器加载的类
- 单一性:类只能被加载一次。
双亲委派类
每次收到类加载请求后,先将请求给父类加载器完成(从顶层Bootstrap ClassLoader开始),如果父类加载器无法完成加载,子类加载器尝试自己加载。
避免了同一个类被多次加载,从而引起混乱。不同类加载器加载的类是不同的类。
破坏双亲模型
重写loadclass方法,先尝试由system类加载期价在,加载失败自己加载,不先给父类加载。
反射
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法(属性)
- 生成动态代理
Class 是一个类; 一个描述类的类.
封装了描述方法的 Method,
描述字段的 Filed,
描述构造器的 Constructor 等属性.
优势
可以动态创建对象和编译,体现出很大的灵活性。
程序编译后发布了,需要更新某些功能时,采用静态的话需要修改后重新编译。使用反射,不用卸载,可以在运行时动态的创建和编译。
缺点
- 对性能有影响,解释操作慢于执行操作。
- 不安全,破坏了类的封装。
与Java反射相关的类如下:
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
有参构造方法
Class<XXX> obj = XXX.class;
Constructor<XXX> con = clazz.getConstructor(String.class,int.class);
XXX obj = con.newInstance("tianye",24);