Java枚举类和反射机制


一、Java枚举类(Enum):

在某些情况下,一个类的对象是有限且固定的,对于这种对象的实例有限且固定的类,在 Java 中被称为枚举类(Enum);枚举类是为了提高代码可读性,原始值是int类型(从0开始)。

创建角色类型枚举类(RoleTypeEnum):Java 中使用 enum 关键字来定义枚举类

// 定义一个角色类型的枚举类
public enum RoleTypeEnum {// 在第一行显式地列出3个枚举实例(枚举值),系统会自动添加 public static final 修饰STUDENT,TEACHER,HEADER  //0-学生,1-老师,2-校长
}

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

int ordinal(): 返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定。

public class Demo01_Enum {public static void main(String[] args) {RoleTypeEnum rt1 = RoleTypeEnum.STUDENT;RoleTypeEnum rt2 = RoleTypeEnum.HEADER;//int ordinal(): 返回枚举值在枚举类中的索引值(从0开始)System.out.println(rt1);//STUDENTSystem.out.println(rt1.ordinal());//0System.out.println(rt2);//HEADERSystem.out.println(rt2.ordinal());//2}
}

static values() 方法遍历所有枚举值:返回一个包含全部枚举值的数组,可以用来遍历所有枚举值。

for(RoleTypeEnum rt : RoleTypeEnum.values()) {System.out.print(rt);//STUDENT TEACHER HEADER
}

举个栗子?:
包含抽象方法的枚举类:

定义一个 Calculator 枚举类,有4个枚举值PLUS、MINUS、TIMES、DIVIDE,分别代表加、减、乘、除,该枚举类有一个 calculate() 抽象方法,用于完成计算。

包含抽象方法的枚举类Calculator:

public enum Calculator {// 加法运算PLUS { // 花括号部分其实是一个匿名内部子类@Overridepublic int calculate(int x, int y) {return x + y;}},// 减法运算MINUS { // 花括号部分其实是一个匿名内部子类@Overridepublic int calculate(int x, int y) {// TODO Auto-generated method stubreturn x - y;}},// 乘法运算TIMES { // 花括号部分其实是一个匿名内部子类@Overridepublic int calculate(int x, int y) {return x * y;}},// 除法运算DIVIDE { // 花括号部分其实是一个匿名内部子类@Overridepublic int calculate(int x, int y) {return x / y;}};//为该枚举类定义一个抽象方法,枚举类中所有的枚举值都必须实现这个方法public abstract int calculate(int x, int y);}

加、减、乘、除计算:

public class TestDemo {public static void main(String[] args) {//加、减、乘、除计算System.out.println("2 + 2 = " + Calculator.PLUS.calculate(2, 2));System.out.println("5 - 2 = " + Calculator.MINUS.calculate(5, 2));System.out.println("2 * 2 = " + Calculator.TIMES.calculate(2, 2));System.out.println("4 / 2 = " + Calculator.DIVIDE.calculate(4, 2));}
}

二、Java类的加载机制和反射:

一、什么是反射?

Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些属性和方法。对于任何一个对象,我们都能够对它的属性和方法进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

解释:在程序运行的时候,查看一个类有哪些信息(包含的成员变量和成员方法),这个过程称之为反射。

一般情况下:如果我们知道我们要使用哪个类,那么我们只需要用这个类创建对象,然后就可以通过这个对象调用类里面的数据变量和方法。

但是如果我们不知道我们要使用哪个类,这个时候我们就需要使用反射来获取到类的信息,知道里面有哪些属性和方法,再使用。

不知道类–>获取类信息–>使用(实例化对象,调用属性和方法):这就是反射。

可以先看完下面的栗子?了,再来理解反射机制,会更清楚。

给定一个User类:(里面有很多属性、构造方法和普通方法,有些是私有的,有些是公共的)

public class User {private int id;private String name;private String password;public int age;public User() {}private User(int id) {this.id=id;}public User(int id,String name,String password,int age) {this.id=id;this.name=name;this.password=password;this.age=age;}public void show() {System.out.println(id+":"+name+":"+password);}public void study() {System.out.println("学习");}public void study(String courseName) {System.out.println("正在学习"+courseName);}private void shower(String courseName) {System.out.println("正在学习私有"+courseName);}
}

1、获取Class对象:
方法一:通过对象来获取 user1.getClass()

User user1 = new User(101, "admin", "123456");
User user2 = new User(102, "User01", "123");Class c1 = user1.getClass();//获取user1的Class对象
Class c2 = user2.getClass();//获取user2的Class对象System.out.println(c1);//class com.sikiedu.chapter4.User
System.err.println(c2);//class com.sikiedu.chapter4.User

方法二:通过类来获取 User.class

Class class4 = User.class;
System.out.println(class4);

方法三:通过 Class.forName(“路径类名”)

Class class5 = Class.forName("java.lang.Math");
System.out.println(class5);//class java.lang.Math

2、利用反射构造User类的对象(获取构造方法):

通过类对象c得到所有的public构造方法(公共的):c.getConstructors();

通过类对象c得到所有的构造方法(包括私有的):c.getDeclaredConstructors();

通过类对象c得到public单个构造方法:c.getConstructor();

通过类对象c得到private单个构造方法(私有的):c.getDeclaredConstructor();

调用无参构造方法:Object object= con.newInstance();

调用私有的无参构造方法(需设置setAccessible(true)):

con.setAccessible(true);
Object object = con.newInstance();
举个栗子?:
public class Demo02 {public static void main(String[] args) throws Exception {//1.取到类对象Class c = Class.forName("com.sikiedu.chapter4.User");//通过类对象得到所有的构造方法(包括私有的)Constructor[] con = c.getDeclaredConstructors();for(Constructor conall : con) {System.out.println(conall);}//2.通过类对象得到类的单个构造方法publicConstructor con1 = c.getConstructor();//无参的构造方法Constructor con2 = c.getConstructor(int.class,String.class,String.class);//有参数的构造方法//加上Declared获取私有的构造方法privateConstructor con3 = c.getDeclaredConstructor(int.class);//3.调用无参构造方法Object o1 = con1.newInstance();Object o2 = con2.newInstance(1001,"admin","123");con3.setAccessible(true);//是否可以接触私有的,设置为trueObject o3 = con3.newInstance(123); User user = (User)o3;user.show();}
}

3、利用反射获取User类的成员变量:

通过类对象c得到所有的public成员变量(公共的):c.getFields();

通过类对象c得到所有的成员变量(包括私有的):c.getDeclaredFields();

通过类对象c得到public单个成员变量:c.getField(“age”).get(user1);

通过类对象c得到private单个成员变量(私有的):

c.getDeclaredField("name").get(user1);
举个栗子?:
public class Demo03 {public static void main(String[] args) throws Exception {User user1 = new User(1001,"admin","123456",21);//1.取到类对象Class c = Class.forName("com.sikiedu.chapter4.User");//利用反射得到User的所有成员变量(包括私有的)Field[] fields= c.getDeclaredFields();for(Field field : fields) {System.out.println(field);}
//      private int com.sikiedu.chapter4.User.id
//      private java.lang.String com.sikiedu.chapter4.User.name
//      private java.lang.String com.sikiedu.chapter4.User.password
//      public int com.sikiedu.chapter4.User.age//利用反射得到User的public成员变量(公共的)Field[] fields2= c.getFields();for(Field field : fields2) {System.out.println(field);}
//      public int com.sikiedu.chapter4.User.age//得到单个公共的Field fieldage = c.getField("age");System.out.println(fieldage.get(user1));//21//得到单个私有的Field fieldname = c.getDeclaredField("name");fieldname.setAccessible(true);System.out.println(fieldname.get(user1));//admin}
}

4、利用反射获取User类的成员方法:

通过类对象c得到所有成员方法(包括父类的):c.getMethods();

通过类对象c得到自身的所有成员方法(包括私有的private):c.getDeclaredMethods();

通过类对象c得到public单个成员方法:c.getMethod(“show”).invoke(user1);

通过类对象c得到private单个成员方法(私有的):

c.getDeclaredMethod(“shower”,String.class).invoke(user1,“编程”);

举个栗子?:

public class Demo02 {public static void main(String[] args) throws Exception {User user1 = new User(1001,"admin","123456",21);//1.取到类对象Class c = Class.forName("com.sikiedu.chapter4.User");//利用反射得到User的所有成员方法(包括父类的)Method[] methods= c.getMethods();for(Method method : methods) {System.out.println(method);}
//      public void com.sikiedu.chapter4.User.show()
//      public void com.sikiedu.chapter4.User.study()
//      public void com.sikiedu.chapter4.User.study(java.lang.String)
//      public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
//      public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
//      public final void java.lang.Object.wait() throws java.lang.InterruptedException
//      public boolean java.lang.Object.equals(java.lang.Object)
//      public java.lang.String java.lang.Object.toString()
//      public native int java.lang.Object.hashCode()
//      public final native java.lang.Class java.lang.Object.getClass()
//      public final native void java.lang.Object.notify()
//      public final native void java.lang.Object.notifyAll()//利用反射得到User的自身的所有成员方法(包括私有的private)Method[] methods2= c.getDeclaredMethods();for(Method method : methods2) {System.out.println(method);}
//      public void com.sikiedu.chapter4.User.study()
//      public void com.sikiedu.chapter4.User.study(java.lang.String)
//      public void com.sikiedu.chapter4.User.show()//得到单个成员方法Method method = c.getMethod("show");Object object = method.invoke(user1);//得到单个有参数Method method2 = c.getDeclaredMethod("shower",String.class);method2.setAccessible(true);Object object2 = method2.invoke(user1,"编程");}
}

看到这里你已经对反射有了一个简单的了解,可以使用反射获取一些属性方法,其实我们平时写代码很少用到反射技术,但是在我们使用的一些主流框架中反射技术应用是非常广泛的,所以学好反射也是非常有必要的。

今日寄语:

“人的一生为什么要努力?” “因为最痛苦的事,不是失败,是我本可以!”——杨熹文

Java学习总结3——枚举类和反射机制相关推荐

  1. Java学习笔记day7——枚举类练习、包装类、抽象类、接口

    1. 枚举类的常用方法 (1)String name():返回枚举常量对象名称 (2)int ordinal():返回常量对象的下标 (3)String toString():Enum父类又重写了Ob ...

  2. Java基础学习——第十章 枚举类注解

    Java基础学习--第十章 枚举类&注解 一.枚举类(enum) 1. 枚举类的概念 枚举类:类的对象只有有限个,确定的 线程状态:创建.就绪.运行.阻塞.死亡 当需要定义一组常量时,强烈建议 ...

  3. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  4. java mybatis enum_mybatis处理枚举类的简单方法

    mybatis自带对枚举的处理类 org.apache.ibatis.type.EnumOrdinalTypeHandler :该类实现了枚举类型和Integer类型的相互转换. 但是给转换仅仅是将对 ...

  5. Java中的enum枚举类

    首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...

  6. 21天学通Java学习笔记-Day11(常用类)

    java 常用类(重点): String 类: String 类代表字符串.创建以后不能更变. public class tests { public static void main(String[ ...

  7. java string转enum_java枚举类Enum方法简介(valueof,value,ordinal) (转)

    Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口.   当我们在声明一个enum类型时,我们应该注意到en ...

  8. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

  9. 【Java】6.9 枚举类

    目录 枚举类简介 实现枚举类 枚举类的成员变量.方法和构造器 枚举类简介 [什么是枚举类?] 枚举类就是实例有限且固定的类.且在定义时,枚举类要在第一行全部列出 [为什么要是用枚举类?] 使用枚举类可 ...

最新文章

  1. Oracle 11g 新特性 -- Transparent Data Encryption (透明数据加密TDE) 增强 说明
  2. 关于 sql server 基本使用的建议
  3. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍
  4. DockingManager的使用入门
  5. SSM:Maven整合ssm时的步骤
  6. 消息队列(2):常见的消息队列协议
  7. 基于深度学习的目标检测技术演进:从目标检测到人脸检测
  8. 使用busybox制作iniramfs
  9. 为何要弃 Java、Swift 于不顾,而选择 Python?
  10. Linux命令-用户和组管理
  11. 免费获得卡巴斯基key的方法
  12. aria2,破解限速的傻瓜式教程
  13. [JAVA毕业设计]大数据在线考试系统在线阅卷系统及大数据统计分析源码获取和系统演示
  14. 将bat文件转化成exe
  15. 双冠家园新版腾讯QLV格式转换器,qlv格式转MP4,支持新版客户端
  16. 浅谈支付宝第三方支付
  17. 5G QoS控制原理专题详解-QoS控制原理(2)
  18. vue-cli之加载ico文件
  19. 一些个人常用的网站网址
  20. 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay

热门文章

  1. yii学习笔记—gii 自动代码生成工具
  2. [敏捷开发]研发管理 开发过程管理
  3. 记一个异常原因,QQ和微信可以正常使用,无法访问百度
  4. 【软件之道】Word模板的制作及使用
  5. suse 卸载mysql_suse9上安装和卸载Mysql
  6. WPS 2010 页眉下方添加下划线
  7. matlab将图片旋转的代码_论文写作经验分享word+mathtype+matlab
  8. 微信公众号的代码块插入,及一键排版
  9. cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义
  10. 如何用代码画出一幅好看的画