Java之class类

Class类

在这里插入图片描述
1.类图在这里插入图片描述

2.Class类对象 系统创建在这里插入图片描述
该class对象是通过类加载器ClassLoader的loadClass()方法生成对应类对应的class对象
通过debug可以追到该方法
在这里插入图片描述
3.对于某个类的class类对象
只加载一次
因为类值加载一次
类加载的时机

//1.创建对象实例的时候(new)
//2.创建子类对象实例的时候,父类也会被加载
//3.使用该类的静态成员变量时,该类也会加载

演示一下
在这里插入图片描述
运行结果
在这里插入图片描述
4.在这里插入图片描述
大概就是我们创建的对象(比如cat)
这个cat对象和我们堆中Cat类对于的Class对象
有联系,cat和对应的Cat类的Class对象有联系

简而言之,每个对象从属于所属类的Class对象
其实我们的getClass返回的就是这个Class对象
5.通过对应方法来获得对应的属性/方法,具体在下面常用方法

6.没什么好说的
7.
在这里插入图片描述

常用方法

在这里插入图片描述

package yuan.hsp.reflection.Class;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import yuan.hsp.reflection.Cat;
@SuppressWarnings({"all"})
//class类的基本介绍
public class introduce {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
	String classPath="yuan.hsp.reflection.Class.Car";
	//1.获取到Car类对应的Class对象
	Class cls = Class.forName(classPath);
	//2.输出cls
	System.out.println(cls);//会显示是哪个类的Class对像(应该是toString重写的)
	System.out.println(cls.getClass());//输出cls的运行类型 java.lang.Class
	//3.得到包名
	System.out.println("================================");
	System.out.println(cls.getPackage().getName());
	System.out.println(cls.getPackageName());//两种都可以
	//4.得到全类名
	System.out.println("================================");
	System.out.println(cls.getName());//返回类名
	//5.通过cls创建对象实例
	Object newInstance = cls.newInstance();//当然这个现在弃用了
	
	Car newInstance2 = (Car)cls.getDeclaredConstructor().newInstance();//现在一般用这个方法
	//先获构造器再创建对象实例
	System.out.println(newInstance2);
	//6.通过反射获取属性brand,注意:私有属性不能通过该方式获取,后面有单独讲
	Field brand = cls.getField("brand");
	System.out.println(brand.get(newInstance2));
	//7.通过反射给属性赋值
	brand.set(newInstance2, "奔驰");
	System.out.println(brand.get(newInstance2));
	//8.希望可以得到Car里所有的属性
	System.out.println("======================================");
	Field[] fields = cls.getFields();
	for (Field field : fields) {
		System.out.println(field.getName());//依次输出属性的名称
	}
	
	
}
}

class Car{
	public String brand="宝马";
	public int price=1000000;
	public String color="白";
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + ", color=" + color + "]";
	}
	
}

运行结果
class yuan.hsp.reflection.Class.Car
class java.lang.Class
================================
yuan.hsp.reflection.Class
yuan.hsp.reflection.Class
================================
yuan.hsp.reflection.Class.Car
Car [brand=宝马, price=1000000, color=白]
宝马
奔驰
======================================
brand
price
color

获取Class类对象的六种方式

主要方法是前四种
还有两种特别的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package yuan.hsp.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

//本篇主要是获取Class类的各种方法
@SuppressWarnings({"all"})
public class GetClass {
	public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, IOException {
		//1.Class.forName(对应类的全路径)-常用于配置文件读取类全路径,加载类
		Properties properties = new Properties();
		properties.load(new FileInputStream("src\\re.properties"));
		String classfullpath = properties.get("classfullpath").toString();
		Class cls1 = Class.forName(classfullpath);
		System.out.println(cls1);
		//2.若已知具体的类,通过类的class获取,该方式最安全可靠程序性能最高-多用于参数传递
		Class cls2 = Cat.class;
		System.out.println(cls2);
		//3.已知某个类的实例,调用该对应的getClass()方法,获取对象所属类对应的Class对象-应用场景:通过建好的对象,获取Class对象(运行类型)
		Cat cat = new Cat();
		Class cls3 = cat.getClass();
		System.out.println(cls3);
		//4.通过类加载器获取类的Class对象
		//(1)先得到类加载器cat
		ClassLoader classLoader = cat.getClass().getClassLoader();
		//(2)通过类加载器得到Class对象
		Class cls4 = classLoader.loadClass(classfullpath);
		System.out.println(cls4);
		//cls1,cls2,cls3,cls4都是同一个Class对象
		
		//基本数据类型获取class的两种方式
		//1.(基本数据类型int,short,long).class得到Class对象
		Class<Integer> i = int.class;
		Class<Character> c = char.class;
		System.out.println(i);
		System.out.println(c);
		//2.基本数据类型对应的包装类.type,获得对应的Class对象
		Class<Integer> type = Integer.TYPE;
		System.out.println(type);
		//然后其实这个int和Integer其实是对应的一个Class,int自动装箱为Integer获取对应的Class对象
		System.out.println(i.hashCode());
		System.out.println(type.hashCode());
	}

}

其实前四种方式是不同阶段的获取
1.代码阶段2.加载阶段3.RunTime阶段(创建完对象后)4类加载过程阶段
在这里插入图片描述

哪些类有Class对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值