1. Class类
[1] 对象照镜子后可以得到信息: 某个类的属性,方法和构造器,某个类到低实现了哪些接口。对于每个类而言, JRE都为其保留了一个不变的Class类型对象。
一个Class对象包含了特定某个结构(class/interface/enum(枚举)/annotation(注解)/primitive type(基本类型)/void[]) 的相关信息
- Class 本身也是一个类
- Class对象只能由系统建立对象
- 一个加载的类在JVM中只会有一个Class实例
- 一个Class对象对应的是一个加载到JVM中的一个.class文件
- 每个类的实例都会记得自己是由那个Class类锁生成的
- 通过Class可以完整地得到一个类中所有加载的结构
- Class类是Reflection的根源,针对任何你想动态加载,运行的类,唯有先获得Class对象
Class类常用的方法
获得Class的实例的方式
<1> 若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
Class clazz = Person.class
<2> 已知某个具体类的实例,调用实例的getClass() 方法获取Class对象
//person为类Person的实例
Class clazz = person.getClass();
<3> 已知一个类的全类名,且该类在类路径下,通过Class类的静态方法forName() 获取,抛出ClassNotFoundException
//若在项目路径下存在 demo01/Student 的类
Class clazz = Class.forName("demo01.Student");
<4> 内置基本数据类型可以直接用 类名.Type
<5> 还可以利用ClassLoader加载
相关测试
package com.gs.reflection;
//测试Class类的创建方式有哪些
public class test03 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
System.out.println("这个人是:"+person.name);
// 方式一: 通过对象获得
Class c1 = person.getClass();
System.out.println(c1.hashCode());
// 方式二: forName获得
Class c2 = Class.forName("com.gs.reflection.Student");
System.out.println(c2.hashCode());
//方式三: 通过类名.class获得
Class c3 = Student.class;
System.out.println(c3.hashCode());
//方式四: 基本内置类型的包装类都有一个Type属性
Class c4 = Integer.TYPE;
System.out.println(c4);
//获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
public String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
}
class Student extends Person{
public Student() {
this.name = "学生";
}
}
class Teacher extends Person{
public Teacher() {
this.name = "老师";
}
}
[2] 哪些类可以有Class对象
- class: 外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
- interface: 接口
- [ ]: 数组
- enum : 枚举
- annotation: 注解@interface
- primitive type: 基本数据类型
- void
相关测试
package com.gs.reflection;
import java.lang.annotation.ElementType;
//所有类型的Class
public class test04 {
public static void main(String[] args) {
//alt键可以进行多选 ctrl+d可以复制一行
Class c1 = Object.class; //类
Class c2 = Comparable.class; //接口
Class c3 = String[].class; //一维数组
Class c4 = int[][].class; // 二维数组
Class c5 = Override.class; //注解
Class c6 = ElementType.class; //枚举
Class c7 = Integer.class; //基本数据类型
Class c8 = void.class; // void
Class c9 = Class.class; // Class
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
//只要元素类型与维度一样,就是同一个Class(a的hash值与b是相等的)
int [] a = new int[10];
int [] b = new int[100];
String[] c = new String[100];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());
System.out.println(c.getClass().hashCode());
}
}
转载:https://blog.csdn.net/TheWindOfSon/article/details/105492929
查看评论