Class类特点和方法
【摘要】 Class类介绍(1)Class也是类,因此也要继承Object类(2)Class类对象不是new出来的,而是系统创建的(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次(4)每个类的实例都会记得自己是由哪个Class实例所生成的(5)通过Class对象可以完整的得到一个类的完整结构,通过一系列API(6)Class对象是存放在堆的(7)类的字节码二进制数据,是放在方法区...
Class类
介绍
(1)Class也是类,因此也要继承Object类
(2)Class类对象不是new出来的,而是系统创建的
(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
(4)每个类的实例都会记得自己是由哪个Class实例所生成的
(5)通过Class对象可以完整的得到一个类的完整结构,通过一系列API
(6)Class对象是存放在堆的
(7)类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)
对Class类特点的梳理
import com.hspedu.Cat;
import java.util.ArrayList;
public class Class01 {
public static void main(String[] args) throws ClassNotFoundException {
//1. Class 也是类,因此也继承 Object 类
//2. Class 类对象不是 new 出来的,而是系统创建的
//(1) 传统 new 对象
/* ClassLoader 类
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
//Cat cat = new Cat();
//(2) 反射方式, 刚才老师没有 debug 到 ClassLoader 类的 loadClass, 原因是,我没有注销 Cat cat = new Cat();
/*
ClassLoader 类, 仍然是通过 ClassLoader 类加载 Cat 类的 Class 对象
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
Class cls1 = Class.forName("com.hspedu.Cat");
//3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次
Class cls2 = Class.forName("com.hspedu.Cat");
System.out.println(cls1.hashCode());
System.out.println(cls2.hashCode());
Class cls3 = Class.forName("com.hspedu.Dog");
System.out.println(cls3.hashCode());
}
}
Class类常用方法案例
import com.hspedu.Car;
import java.lang.reflect.Field;
public class Class02 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
String classAllPath = "com.hspedu.Car";
//1 . 获取到 Car 类 对应的 Class 对象
//<?> 表示不确定的 Java 类型
Class<?> cls = Class.forName(classAllPath);
//2. 输出 cls
System.out.println(cls); //显示 cls 对象, 是哪个类的 Class 对象 com.hspedu.Car
System.out.println(cls.getClass());//输出 cls 运行类型 java.lang.Class
//3. 得到包名
System.out.println(cls.getPackage().getName());//包名
//4. 得到全类名
System.out.println(cls.getName());
//5. 通过 cls 创建对象实例
Car car = (Car) cls.newInstance();
System.out.println(car);//car.toString()
//6. 通过反射获取属性 brand
Field brand = cls.getField("brand");
System.out.println(brand.get(car));//宝马
//7. 通过反射给属性赋值
brand.set(car, "奔驰");
System.out.println(brand.get(car));//奔驰
//8 我希望大家可以得到所有的属性(字段)
System.out.println("=======所有的字段属性====");
Field[] fields = cls.getFields();
for (Field f : fields) {
System.out.println(f.getName());//名称
}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)