Класс перечисления Java и механизм отражения
1. Класс перечисления Java (Enum):
В некоторых случаях объекты класса конечны и фиксированы, и класс, экземпляры таких объектов конечны и фиксированы, называется в JavaКласс перечисления (Enum); Класс перечисления предназначен для улучшения читаемости кода, исходное значение имеет тип int (начиная с 0).
Создайте класс перечисления типов ролей (RoleTypeEnum): используйте ключевое слово enum для определения класса перечисления в Java.
// 定义一个角色类型的枚举类
public enum RoleTypeEnum {
// 在第一行显式地列出3个枚举实例(枚举值),系统会自动添加 public static final 修饰
STUDENT,TEACHER,HEADER //0-学生,1-老师,2-校长
}
порядковый номер():Возвращает значение индекса (начиная с 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);//STUDENT
System.out.println(rt1.ordinal());//0
System.out.println(rt2);//HEADER
System.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() для завершения вычисления.
Калькулятор класса Enum с абстрактными методами:
public enum Calculator {
// 加法运算
PLUS { // 花括号部分其实是一个匿名内部子类
@Override
public int calculate(int x, int y) {
return x + y;
}
},
// 减法运算
MINUS { // 花括号部分其实是一个匿名内部子类
@Override
public int calculate(int x, int y) {
// TODO Auto-generated method stub
return x - y;
}
},
// 乘法运算
TIMES { // 花括号部分其实是一个匿名内部子类
@Override
public int calculate(int x, int y) {
return x * y;
}
},
// 除法运算
DIVIDE { // 花括号部分其实是一个匿名内部子类
@Override
public 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:
1. Что такое отражение? Отражение Java говорит, что в рабочем состоянии для любого класса мы можем знать, какие свойства и методы есть у этого класса. Для любого объекта мы можем вызывать его свойства и методы. Мы называем эту функцию динамического получения информации об объекте и вызова методов объекта механизмом отражения.
Объяснение: Когда программа работает, проверьте, какую информацию имеет класс (включая переменные-члены и методы-члены). Этот процесс называется отражением.
В общем: если мы знаем, какой класс мы хотим использовать, то нам нужно только создать объект с этим классом, и тогда мы можем вызывать переменные данных и методы в классе через этот объект. Но если мы не знаем, какой класс мы хотим использовать, в это время нам нужно использовать отражение, чтобы получить информацию о классе, узнать, какие свойства и методы в нем есть, а затем использовать его.
Не знаю класс --> получить информацию о классе --> использовать (создать экземпляр объекта, вызвать свойства и методы): это отражение. Вы можете сначала прочитать каштаны ниже 🌰, а потом уже разбираться в механизме отражения, так будет понятнее.
Учитывая класс пользователя: (в нем много свойств, конструкторов и общих методов, некоторые из них являются частными, а некоторые общедоступными)
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. Получите объект класса: Способ 1: пройти через объект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
Способ 2: пройти через классUser.class
Class class4 = User.class;
System.out.println(class4);
Способ 3: пройтиClass.forName("имя класса пути")
Class class5 = Class.forName("java.lang.Math");
System.out.println(class5);//class java.lang.Math
2. Используйте отражение для создания объекта класса User (получите конструктор):
Получить все общедоступные конструкторы (public) через объект класса c:c.getConstructors();Получить все конструкторы (включая приватные) через объект класса c:c.getDeclaredConstructors();Получите общедоступный единственный конструктор через объект класса c:c.getConstructor();Получить частный одиночный конструктор (приватный) через объект класса c: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.通过类对象得到类的单个构造方法public
Constructor con1 = c.getConstructor();//无参的构造方法
Constructor con2 = c.getConstructor(int.class,String.class,String.class);//有参数的构造方法
//加上Declared获取私有的构造方法private
Constructor con3 = c.getDeclaredConstructor(int.class);
//3.调用无参构造方法
Object o1 = con1.newInstance();
Object o2 = con2.newInstance(1001,"admin","123");
con3.setAccessible(true);//是否可以接触私有的,设置为true
Object o3 = con3.newInstance(123);
User user = (User)o3;
user.show();
}
}
3. Используйте отражение, чтобы получить переменные-члены класса User:
Получить все общедоступные переменные-члены (общедоступные) через объект класса c:c.getFields();Получить все переменные-члены (включая частные) через объект класса c:c.getDeclaredFields();Получите общедоступную переменную с одним членом через объект класса c:c.getField("age").get(user1);Получите частную переменную с одним членом (частную) через объект класса c: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 private):c.getDeclaredMethods();Получить общедоступный одночленный метод через объект класса c:c.getMethod("show").invoke(user1);Получить частный одночленный метод (частный) через объект класса c:c.getDeclaredMethod("душ",String.class).invoke(user1,"programming");
Возьмите каштан 🌰:
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,"编程");
}
}
Глядя здесь, у вас есть простое понимание отражения. Вы можете использовать отражение для получения некоторых методов атрибутов. На самом деле, мы редко используем технологию отражения при написании кода, но технология отражения широко используется в некоторых основных фреймворках, которые мы используем. тоже очень нужно.
Сегодняшнее сообщение:
«Почему люди много работают в своей жизни?» «Потому что самое болезненное — это не неудачи, но я мог бы это сделать!» — Ян Сивэнь.Приглашаем обратить внимание на личный публичный аккаунт WeChat:Персиково-сливовая примула