类是创建对象的模板,理论上一个类可以创建无数个对象。有时候一个类只能创建几个特定的对象(限定:星期类,七个 对象;季节类,四个对象)。
一.枚举类
能够限定我们创建对象的个数。每个枚举项之间用逗号相连,采用全部大写的方式进行命名。
枚举类如何限定对象的?
①不能和普通类一样通过new构造器的方式来创建对象。
②所有的对象在创建枚举类的时候就先定义好,然后直接调用对象。
二.线程状态
根据线程状态创建枚举类
三.反射
java获取类信息的能力叫做反射。
1.反射的创建方式:
①Class.forName("全类名"),全类名:包名+类名;
②类名.class;
③对象名.getClass;
2.通过反射获取类信息(全局变量、方法、构造器)
①全局变量
getDeclaredFields(); 获取所有的类的全局变量 Field[ ]
getFields(); 获取public修饰符修饰的全局变量 Field[ ]
getDeclaredField(String name); 获取指定变量 Field
getField(String name); 获取public下的指定变量 Field
②方法
getDeclaredMethods(); 获取全部的类的方法
getMethods(); 获取所有的public修饰的方法信息
getDeclaredMethod(name, String.class,char.class); 获取指定的类的方法(里面是入参类型)(“方法名”,参数类型.class)
getMethod(name, int.class,char.class); 获取public修饰的指定的类的方法
③构造器
getDeclaredConstructors(); 获取全部的类的构造器
getConstructors(); 获取所有的public修饰的类构造器
getDeclaredConstructor(parameterTypes); 获取指定的构造器(里面是入参类型)
getConstructor(String.class,int.class); 获取public修饰的指定的类构造器
3.通过信息来操作类
①变量
获取变量,并给变量赋值
Field name = class1.getField("name");
EnumClass enums = new EnumClass(); 因为反射只能赋值,所以我们提前创建对象给全局变量分配内存空间
赋值set(obj,value) set(对象,值) 取值get(obj,value) 针对public类型的全局变量
Field phone = class1.getDeclaredField("phone"); 针对default/protected类型的全局变量
sex.setAccessible(true); 针对private类型,我们不能直接设置值,需要暴力反射
②方法
Method run = class1.getMethod("run", int.class);
执行方法invoke(obj, args)
EnumClass enums = new EnumClass();
run.invoke(enums, 1000); 针对public类型的方法
Method eat = class1.getDeclaredMethod("eat", String.class,int.class);
eat.setAccessible(true);
eat.invoke(enums1, "张三",10); 针对private类型的方法
③构造器
Constructor constructor = class1.getConstructor(String.class,int.class);
newInstance();
EnumClass enums = (EnumClass) constructor.newInstance("张三",200); 针对public类型的构造器
Constructor constructor1 = class1.getDeclaredConstructor(String.class);
constructor1.setAccessible(true);
EnumClass enums2 = (EnumClass) constructor1.newInstance("121212121"); 针对private类型的构造器