Резюме обучения Java 3 - класс перечисления и механизм отражения

Java

Класс перечисления 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:Персиково-сливовая примула