java基础反射代码详解总结
java反射获取类的get,set方法

java反射获取类的get,set方法Java反射是一种机制,可以在运行时获取类的信息,并且在运行时操作类的属性、方法等。
通过反射,我们可以获取到类的get和set 方法,并且在需要的时候使用这些方法来修改和访问类的属性。
要使用Java的反射机制来获取类的get和set方法,首先需要使用反射中的Class类来表示一个类的信息。
在Java中,通过Class类可以获取到各种类的信息,比如类的属性、方法、构造函数等。
而对于get和set方法,它们实际上是类的属性的访问和修改方法,所以我们需要先获取到类的属性,然后通过属性来获取对应的get和set方法。
获取类的get和set方法的具体步骤如下:1.首先,使用Class.forName方法来获取要操作的类的Class对象。
例如,如果要获取类名为"Student"的类的get和set方法,可以使用以下代码:```Class<?> clazz = Class.forName("Student");```这里的"Student"是一个包含类名的字符串,实际上可以是任意一个类的全限定名。
2.接下来,通过调用Class对象的getDeclaredFields方法获取到类的所有属性。
getDeclaredFields方法会返回一个Field数组,包含了类的所有属性。
例如,我们可以使用以下代码来获取所有属性:```Field[] fields = clazz.getDeclaredFields();```3.对于每一个属性,通过属性的名称可以得到对应的get和set 方法。
由于Java的命名规范中,get和set方法的名称通常是以"get"和"set"开头的,后跟属性的首字母大写的形式。
因此,我们可以通过拼接字符串的方式来获取到对应的方法名。
例如,对于属性名为"age"的属性,我们可以得到对应的get方法名为"getAge",set方法名为"setAge"。
java反射调用list参数的方法

java反射调用list参数的方法Java反射是一种强大的机制,它允许程序在运行时动态地获取类的信息并调用其方法。
本文将以Java反射调用带有List参数的方法为主题,详细介绍反射的基本原理和使用方法。
一、什么是Java反射?Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,并且对于任意一个对象,都能够调用它的任意方法。
反射使得我们可以在运行时动态地创建对象、调用方法和访问属性,极大地提高了程序的灵活性和扩展性。
二、反射的基本原理在Java中,每个类都有一个对应的Class对象,通过这个Class对象可以获取类的所有信息。
可以通过以下几种方式获取Class对象:1. 调用对象的getClass()方法;2. 通过类名.class获取;3. 使用Class.forName()方法。
三、使用反射调用List参数的方法假设我们有一个类Person,其中有一个方法public void setHobbies(List<String> hobbies),现在我们要使用反射调用这个方法。
1. 获取Class对象我们需要获取Person类的Class对象,可以使用以下方式之一:```javaClass<Person> personClass = Person.class;Class<?> personClass = Class.forName("com.example.Person");Person person = new Person();Class<? extends Person> personClass = person.getClass();```2. 获取Method对象通过Class对象,可以获取类中的方法。
我们可以使用getMethod()方法获取指定方法的Method对象,如下:```javaMethod setHobbiesMethod = personClass.getMethod("setHobbies", List.class);```3. 创建对象和参数在调用方法之前,我们需要创建Person对象和List参数,如下:```javaPerson person = new Person();List<String> hobbies = new ArrayList<>();hobbies.add("reading");hobbies.add("swimming");```4. 调用方法我们可以使用Method对象的invoke()方法来调用方法,如下:```javasetHobbiesMethod.invoke(person, hobbies);```通过以上步骤,我们成功地使用反射调用了带有List参数的方法。
Java反射(Class类,Class对象获取)

Java反射(Class类,Class对象获取)⽬录Java反射超详解1.反射基础1.1Class类1.2类加载2.反射的使⽤2.1Class对象的获取2.2Constructor类及其⽤法2.3Field类及其⽤法Java反射超详解1.反射基础Java反射机制是在程序的运⾏过程中,对于任何⼀个类,都能够知道它的所有属性和⽅法;对于任意⼀个对象,都能够知道它的任意属性和⽅法,这种动态获取信息以及动态调⽤对象⽅法的功能称为Java语⾔的反射机制。
Java反射机制主要提供以下这⼏个功能:在运⾏时判断任意⼀个对象所属的类在运⾏时构造任意⼀个类的对象在运⾏时判断任意⼀个类所有的成员变量和⽅法在运⾏时调⽤任意⼀个对象的⽅法1.1Class类Class类,Class类也是⼀个实实在在的类,存在于JDK的ng包中。
Class类的实例表⽰java应⽤运⾏时的类(class ans enum)或接⼝(interface and annotation)(每个java类运⾏时都在JVM⾥表现为⼀个class对象,可通过类名.class、类型.getClass()、Class.forName("类名")等⽅法获取class对象)。
数组同样也被映射为为class 对象的⼀个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为 class 对象。
到这我们也就可以得出以下⼏点信息:Class类也是类的⼀种,与class关键字是不⼀样的。
⼿动编写的类被编译后会产⽣⼀个Class对象,其表⽰的是创建的类的类型信息,⽽且这个Class对象保存在同名.class的⽂件中(字节码⽂件)。
每个通过关键字class标识的类,在内存中有且只有⼀个与之对应的Class对象来描述其类型信息,⽆论创建多少个实例对象,其依据的都是⽤⼀个Class对象。
Java利用反射获取object的属性和值代码示例

Java利⽤反射获取object的属性和值代码⽰例在看反射顺便做个笔记,⽬前知道的反射的Object都是要有对象的也就是实体Bean。
referance:import ng.reflect.Field;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/*** 反射处理Bean,得到⾥⾯的属性值** @author liulinsen**/public class ReflexObjectUtil {/*** 单个对象的所有键值** @param object* 单个对象** @return Map<String, Object> map 所有 String键 Object值 ex:{pjzyfy=0.00,* xh=01, zzyl=0.00, mc=住院患者压疮发⽣率, pjypfy=0.00, rs=0, pjzyts=0.00,* czydm=0037, lx=921, zssl=0.00}*/public static Map<String, Object> getKeyAndValue(Object obj) {Map<String, Object> map = new HashMap<String, Object>();// 得到类对象Class userCla = (Class) obj.getClass();/* 得到类中的所有属性集合 */Field[] fs = userCla.getDeclaredFields();for (int i = 0; i < fs.length; i++) {Field f = fs[i];f.setAccessible(true);// 设置些属性是可以访问的Object val = new Object();try {val = f.get(obj);// 得到此属性的值map.put(f.getName(), val);// 设置键值}catch (IllegalArgumentException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}/** String type = f.getType().toString();//得到此属性的类型 if* (type.endsWith("String")) {* System.out.println(f.getType()+"\t是String"); f.set(obj,"12") ;* //给属性设值 }else if(type.endsWith("int") ||* type.endsWith("Integer")){* System.out.println(f.getType()+"\t是int"); f.set(obj,12) ; //给属性设值* }else{ System.out.println(f.getType()+"\t"); }*/}System.out.println("单个对象的所有键值==反射==" + map.toString());return map;}/*** 单个对象的某个键的值** @param object* 对象** @param key* 键** @return Object 键在对象中所对应得值没有查到时返回空字符串public static Object getValueByKey(Object obj, String key) {// 得到类对象Class userCla = (Class) obj.getClass();/* 得到类中的所有属性集合 */Field[] fs = userCla.getDeclaredFields();for (int i = 0; i < fs.length; i++) {Field f = fs[i];f.setAccessible(true);// 设置些属性是可以访问的try {if (f.getName().endsWith(key)) {System.out.println("单个对象的某个键的值==反射==" + f.get(obj));return f.get(obj);}}catch (IllegalArgumentException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}}// 没有查到时返回空字符串return "";}/*** 多个(列表)对象的所有键值** @param object* @return List<Map<String,Object>> 列表中所有对象的所有键值 ex:[{pjzyfy=0.00, xh=01, * zzyl=0.00, mc=住院患者压疮发⽣率, pjypfy=0.00, rs=0, pjzyts=0.00,* czydm=0037, lx=921, zssl=0.00}, {pjzyfy=0.00, xh=02, zzyl=0.00,* mc=新⽣⼉产伤发⽣率, pjypfy=0.00, rs=0, pjzyts=0.00, czydm=0037, lx=13,* zssl=0.00}, {pjzyfy=0.00, xh=03, zzyl=0.00, mc=阴道分娩产妇产伤发⽣率,* pjypfy=0.00, rs=0, pjzyts=0.00, czydm=0037, lx=0, zssl=0.00},* {pjzyfy=0.00, xh=04, zzyl=0.75, mc=输⾎反应发⽣率, pjypfy=0.00, rs=0,* pjzyts=0.00, czydm=0037, lx=0, zssl=0.00}, {pjzyfy=5186.12,* xh=05, zzyl=0.00, mc=剖宫产率, pjypfy=1611.05, rs=13, pjzyts=7.15,* czydm=0037, lx=13, zssl=0.00}]*/public static List<Map<String, Object>> getKeysAndValues(List<Object> object) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();for (Object obj : object) {Class userCla;// 得到类对象userCla = (Class) obj.getClass();/* 得到类中的所有属性集合 */Field[] fs = userCla.getDeclaredFields();Map<String, Object> listChild = new HashMap<String, Object>();for (int i = 0; i < fs.length; i++) {Field f = fs[i];f.setAccessible(true);// 设置些属性是可以访问的Object val = new Object();try {val = f.get(obj);// 得到此属性的值listChild.put(f.getName(), val);// 设置键值}catch (IllegalArgumentException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}}list.add(listChild);// 将map加⼊到list集合中}System.out.println("多个(列表)对象的所有键值====" + list.toString());return list;}/*** 多个(列表)对象的某个键的值* @param object* @param key* @return List<Object> 键在列表中对应的所有值 ex:key为上⾯⽅法中的mc字段那么返回的数据就是: [住院患者压疮发⽣率,* 新⽣⼉产伤发⽣率, 阴道分娩产妇产伤发⽣率, 输⾎反应发⽣率, 剖宫产率]*/public static List<Object> getValuesByKey(List<Object> object, String key) {List<Object> list = new ArrayList<Object>();for (Object obj : object) {// 得到类对象Class userCla = (Class) obj.getClass();/* 得到类中的所有属性集合 */Field[] fs = userCla.getDeclaredFields();for (int i = 0; i < fs.length; i++) {Field f = fs[i];f.setAccessible(true);// 设置些属性是可以访问的try {if (f.getName().endsWith(key)) {list.add(f.get(obj));}}catch (IllegalArgumentException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}}}System.out.println("多个(列表)对象的某个键的值列表====" + list.toString());return list;}}调⽤:List<Object> o=?Service.getAllList();//java反射解析测试ReflexObjectUtil.getKeyAndValue(o.get(0));ReflexObjectUtil.getValueByKey(o.get(0), "mc");ReflexObjectUtil.getKeysAndValues(o);ReflexObjectUtil.getValuesByKey(o, "mc");总结以上就是本⽂关于Java利⽤反射获取object的属性和值代码⽰例的全部内容,希望对⼤家有所帮助。
java反射使用方法

java反射使用方法Java反射是一种在运行时动态获取类的信息并操作它的能力。
反射允许我们使用Java的类对象来获取类的构造函数、方法、字段等信息,并进行相应的操作。
反射对于一些框架和工具类库来说是至关重要的,因为它们需要在运行时动态地获取类的信息来完成特定的任务。
Java反射的使用方法如下:1. 获取一个类的Class对象在Java中,每个类都有一个与之对应的Class对象。
通过Class类的静态方法forName()可以获取一个类的Class对象。
例如,获取Java中的String类的Class对象的代码如下所示:```javaClass<String> clazz = (Class<String>)Class.forName("ng.String");```2. 获取类的构造函数并创建实例我们可以使用Class类的getConstructor()方法获取一个类的构造函数。
获取构造函数后,我们可以使用它来创建一个类的实例。
例如,获取Java中的String类的构造函数并创建实例的代码如下所示:```javaConstructor<String> constructor =clazz.getConstructor(String.class);String str = constructor.newInstance("hello");```3. 获取类的字段并进行操作我们可以使用Class类的getField()和getDeclaredField()方法获取一个类的公共和私有字段。
获取字段后,我们可以使用它们来读取和设置对象中的值。
例如,获取Java中的String类的字段并进行操作的代码如下所示:```javaField field = clazz.getDeclaredField("value");field.setAccessible(true); // 如果字段是私有的,需要设置为可访问char[] value = (char[]) field.get(str); // 读取值value[0] = 'H'; // 修改值```4. 获取类的方法并调用我们可以使用Class类的getMethod()和getDeclaredMethod()方法获取一个类的公共和私有方法。
java反射之Method的invoke方法实现教程详解

java反射之Method的invoke⽅法实现教程详解前⾔在框架中经常会会⽤到method.invoke()⽅法,⽤来执⾏某个的对象的⽬标⽅法。
以前写代码⽤到反射时,总是获取先获取Method,然后传⼊对应的Class实例对象执⾏⽅法。
然⽽前段时间研究invoke⽅法时,发现invoke⽅法居然包含多态的特性,这是以前没有考虑过的⼀个问题。
那么Method.invoke()⽅法的执⾏过程是怎么实现的?它的多态⼜是如何实现的呢?本⽂将从java和JVM的源码实现深⼊探讨invoke⽅法的实现过程。
⾸先给出invoke⽅法多态特性的演⽰代码:public class MethodInvoke {public static void main(String[] args) throws Exception {Method animalMethod = Animal.class.getDeclaredMethod("print");Method catMethod = Cat.class.getDeclaredMethod("print");Animal animal = new Animal();Cat cat = new Cat();animalMethod.invoke(cat);animalMethod.invoke(animal);catMethod.invoke(cat);catMethod.invoke(animal);}}class Animal {public void print() {System.out.println("Animal.print()");}}class Cat extends Animal {@Overridepublic void print() {System.out.println("Cat.print()");}}代码中,Cat类覆盖了⽗类Animal的print()⽅法,然后通过反射分别获取print()的Method对象。
反射 field.get()方法

反射 field.get()方法(原创版2篇)目录(篇1)1.反射概述2.field.get() 方法的作用3.field.get() 方法的用法4.field.get() 方法的注意事项5.示例代码正文(篇1)1.反射概述在 Java 编程语言中,反射是一种强大的机制,允许程序在运行时检查和修改对象的内部状态。
通过反射,我们可以获取对象的类型信息、调用对象的方法、访问对象的属性等。
反射机制使得程序可以更加灵活,但也会增加一定的开销。
2.field.get() 方法的作用反射中,field.get() 方法用于获取指定对象的公共字段(public fields)或属性(properties)的值。
该方法属于ng.reflect.Field 类,可以通过 Field 类的实例来调用。
3.field.get() 方法的用法要使用 field.get() 方法,首先需要获取 Field 对象。
可以通过以下三种途径获取 Field 对象:(1)通过 Class 类的实例获取:使用 Class 类的 getField() 方法,传入属性名和修饰符作为参数。
(2)通过 Class 加载器获取:使用 Class 加载器的 getField()方法,传入属性名和修饰符作为参数。
(3)通过 Field 类的静态方法获取:使用 Field 类的getDeclaredField() 方法,传入属性名和修饰符作为参数。
获取到 Field 对象后,可以使用 field.get() 方法获取属性值。
需要注意的是,该方法需要传入对象实例作为参数。
如果属性是私有的(private),需要设置 Field 对象的 setAccessible(true) 方法来允许访问。
4.field.get() 方法的注意事项在使用 field.get() 方法时,需要注意以下几点:(1)只有公共字段(public fields)或属性(properties)可以使用 field.get() 方法获取,不能获取私有字段(private fields)。
java反射获取方法的参数

java反射获取方法的参数在Java中,可以使用反射机制来获取方法的参数信息。
反射是Java提供的一种能够在运行时获取对象的类型信息以及操作对象的属性、方法等的机制。
通常情况下,获取方法的参数信息需要经过以下几个步骤:1. 获取Class对象:首先需要获取要操作的类的Class对象,可以通过类的全限定名调用Class.forName(方法来获取,或者直接通过类的.class属性来获取。
2. 获取Method对象:通过Class对象中的getMethod(或getDeclaredMethod(方法来获取要操作的方法的Method对象。
getMethod(方法可以获取类中定义的公共方法,而getDeclaredMethod(方法可以获取类中定义的所有方法,包括公共、私有等。
示例代码如下:```javaMethod method = clazz.getMethod("myMethod", int.class, String.class);```上述代码中,首先获取了一个名为"MyClass"的类的Class对象,然后通过getMethod(方法获取了一个名为"myMethod"的方法的Method对象。
方法的第一个参数是表示方法参数的类型,如果有多个参数,则依次传入。
3. 获取参数信息:通过Method对象中的getParameterTypes(方法来获取方法的参数类型,即返回一个Class数组。
通过Method对象中的getParameterCount(方法可以获取方法的参数个数。
示例代码如下:```javaClass<?>[] parameterTypes = method.getParameterTypes(;int parameterCount = method.getParameterCount(;for (Class<?> parameterType : parameterTypes)System.out.println(parameterType.getName();```上述代码中,首先通过getParameterTypes(方法获取了方法的参数类型的Class数组,然后通过getParameterCount(方法获取了方法的参数个数,最后遍历参数类型数组,打印了每个参数的类型名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1工厂设计模式1.1工厂方法模式概述➢工厂:就是生产特定产品的➢实现方式:1>创建一个抽象工厂类,声明抽象方法2>写一个具体的抽象工厂类的子类,由子类负责对象的创建➢优点:后期维护容易,增强了系统的扩展性➢缺点:需要额外的编写代码,增加了工作量代码1.2简单工厂模式概述➢又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例➢特点:一个类负责很多对象的创建代码2类的加载2.1类加载的过程当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
加载就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
连接验证是否有正确的内部结构,并和其他类协调一致准备负责为类的静态成员分配内存,并设置默认初始化值解析将类的二进制数据中的符号引用替换为直接引用初始化就是给属性赋值2.2类加载时机-【面试题】➢加载的原则-用到的时候才加字节码➢比如:⏹创建类的实例⏹访问类的静态变量,或者为静态变量赋值⏹调用类的静态方法⏹初始化某个类的子类⏹直接使用java.exe命令来运行某个主类⏹使用反射方式来强制创建某个类或接口对应的ng.Class对象2.3类加载器类加载器的概述负责将.class文件加载到内存中,并为之生成对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
类加载器的分类➢Bootstrap ClassLoader 根类加载器➢Extension ClassLoader 扩展类加载器➢System ClassLoader 系统类加载器各类加载器的作用Bootstrap ClassLoader 根类加载器也被称为引导类加载器,负责Java核心类的加载比如System,String等。
在JDK中JRE的lib目录下rt.jar文件中Extension ClassLoader 扩展类加载器负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录System ClassLoader 系统类加载器负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar 包和类路径3 反射3.1反射概述➢JAVA反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法;➢对于任意一个对象,都能通过反射够调用它的任意一个方法和属性;➢要想解剖一个类,必须先要获取到该类的字节码文件对象。
3.2 获取字节码对象三种方式➢Object类的getClass()方法,判断两个对象是否是同一个字节码文件➢静态属性class,锁对象➢Class类中静态方法forName()3.3 案例读取配置文件创建字节码对象3.4 通过反射获取参构造方法使用要点:1.如果要使用反射,先要获取字节码对象2.通过字节码对象的getConstructor()可以获取到构造方法对象3.构造方法对象(Contructor),有个newInstance方法创建这个字节码对象4.反射是在ng.reflect这个包中5.反射的作用一般是用于写框架(ssh,ssm)代码:3.5 通过反射获取类属性使用要点1.Class的etField(String)方法可以获取类中的指定字段(可见的),2.如果是私有的,可以用getDeclaedField("name")方法获取3.通过set(obj, "李四")方法可以设置指定对象上该字段的值4.如果是私有的需要先调用setAccessible(true)设置访问权限,5.调用get(obj)可以获取指定对象中该字段的值代码//1.获取字节码对象Class clz = Teacher.class;//2.获取color字段Field colorField = clz.getField("color");System.out.println(colorField);//3.通过反射给字段赋值Teacher teacher = new Teacher();//teacher.color = "白色";colorField.set(teacher, "黄色");//4.获取私有name属性Field nameField = clz.getDeclaredField("name");System.out.println(nameField);//5.通过反射给私有属性赋值nameField.setAccessible(true);//设置私有属性可以访问nameField.set(teacher, "gyf");System.out.println(teacher);//6.通过反射获取私有属性的值Object value = nameField.get(teacher);System.out.println(value);3.6通过反射获取方法并使用使用要点1.反射中通过Method类描述方法【构造方法:Contructor,字段:Field】2.通过Class的getMethod可以获取一个方法3.通过getDeclaredMethod可以获取私有方法4.如果要调用私有方法,设置访问权限setAccessible代码3.7 案例越过泛型的检查3.8 写一个通用的方法,设置对象的属性值4动态代理概述1.代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象。
举例:春节回家买票让人代买2.在Java中ng.reflect包下提供了一个Proxy类和一个InvocationHandler接口3.通过使用这个类和接口就可以生成动态代理对象。
4.JDK提供的代理只能针对接口做代理。
我们有更强大的代理cglib5.Proxy 通过newProxyInstance(loader,interfaces,h)创建代理对象5.InvocationHandler的invoke(proxy,method, args)方法会拦截方法的调用案例代码public class Demo01 {public static void main(String[] args) {//1.创建对象UserServiceImpl usi = new UserServiceImpl();/* usi.registerUser();usi.deleteUser();*///2.创建代理对象UserService proxy = (UserService)Proxy.newProxyInstance(usi.getClass().getClassLoader(),usi.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// TODO Auto-generated method stubSystem.out.println(method);System.out.println("权限检验...");//拦截了方法Object returnObj = method.invoke(usi, args);System.out.println("日志记录");return returnObj;}});//System.out.println(proxy.getClass());proxy.registerUser();proxy.deleteUser();}}interface UserService{public void registerUser();public void deleteUser();}class UserServiceImpl implements UserService{@Overridepublic void registerUser() {//System.out.println("权限校验...");System.out.println("注册一个用户");//System.out.println("日志记录...");}@Overridepublic void deleteUser() {//System.out.println("权限校验...");System.out.println("删除一个用户");//System.out.println("日志记录...");}}5 模版设计模式模版模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现public long getScheduleTime(){long start = System.currentTimeMillis();code();long end = System.currentTimeMillis();long delta = end - start;//设置时间差return delta;}public abstract void code();}class Test1 extends TimeTemplate{@Overridepublic void code() {for(int i=0;i<100000;i++){System.out.println("我喜欢林心茹...");}}}6 枚举6.1 概述1.枚举是指将变量的值一一列出来,可以称为『数据集』。
举例:一周只有7天,一年只有12个月,一年有四个季节等。
2.Java中enum通过声明的类称为枚举类3.枚举其实就是限定范围,防止不应该发生的事情发生4.枚举注意事项定义枚举类要用关键字enum所有枚举类都是Enum的子类枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。
建议不要省略枚举类可以有构造器,但必须是private的,它默认的也是private的。
枚举类也可以有抽象方法,但是枚举项必须重写该方法枚举在switch语句中的使用5.枚举是一个特殊类6.2 枚举的声明//一年有四个季节enum Season{//春夏秋冬SPRING("春天"){@Overridepublic void test() {}},SUMMER("夏天"){@Overridepublic void test() {// TODO Auto-generated method stubSystem.out.println("夏天夏天夏天悄悄过去...");}},AUTUMN("秋天"){@Overridepublic void test() {// TODO Auto-generated method stub}},WINTER("冬天"){@Overridepublic void test() {// TODO Auto-generated method stub}};/*Season(){System.out.println("空参的构造方法");6.3 枚举的常见方法➢int ordinal() 枚举项都有索引,从0开始➢int compareTo(E o)➢String name() 枚举项名称➢String toString()➢<T> T valueOf(Class<T> type,String name)通过字节码对象获取枚举对象➢values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便public class Demo01 {public static void main(String[] args) {//枚举类的常见方法//1.获取枚举对象Season s1 = Season.SPRING;Season s2 = Season.WINTER;System.out.println("s1:" + s1.ordinal());System.out.println("s2:" + s2.ordinal());//2.比较枚举[索引相减]System.out.println(pareTo(s2));//3.打印枚举项名称System.out.println("s1 name:" + ());System.out.println("s1:" + s1.toString());//枚举项名称//4.通过字节码对象获取枚举对象【没啥用】Season s3 = Season.valueOf(Season.class, "SPRING");System.out.println("s3:" + s3);7 JDK新特性7.1 JDK7的新特性public static void main(String[] args) throws Exception { //JDK7的六个新特性回顾和讲解// A:二进制字面量System.out.println(0b1000);// B:数字字面量可以出现下划线System.out.println(1000_0000);// C:switch 语句可以用字符串String s = "A";switch (s) {case"A":break;case"B":break;default:break;}// D:泛型简化,菱形泛型//List<String> list = new ArrayList<String>();List<String> list = new ArrayList<>();7.2 JDK8的新特性➢接口中可以定义有方法体的方法➢如果是非静态,必须用default修饰。