13.Java反射+日期和时间API

一、反射(Reflection)

        反射是 Java 中一种强大的机制,它允许在程序运行时获取类的信息,如类的成员变量、方法、构造函数等,并能够在运行时调用任意对象的方法。反射使得 Java 程序能够在运行时动态地加载和使用类,具有很强的灵活性和扩展性,常用于框架、插件、动态代理等领域。

1.Java 反射主要涉及以下几个类和接口:

  • Class 类:表示一个类的元信息,可以获取类的名称、修饰符、构造函数、成员变量、方法等信息。
  • Constructor 类:表示一个构造函数的元信息,可以获取构造函数的名称、修饰符、参数列表等信息。
  • Field 类:表示一个成员变量的元信息,可以获取成员变量的名称、修饰符、类型等信息。
  • Method 类:表示一个方法的元信息,可以获取方法的名称、修饰符、参数列表、返回值类型等信息。
  • Modifier 类:提供了一组静态方法,用于操作访问修饰符的二进制表示。

2.使用反射可以完成以下一些常见的操作:

2.1动态加载类:可以在程序运行时加载一个未知的类。

        我们可以使用Class.forName()方法来动态加载类。这个方法会返回一个表示该类的Class对象。例如,我们可以通过以下方式动态加载一个名为com.example.Test的类:

Class clazz = Class.forName("com.example.Test");

2.2.获取类的信息:可以获取类的名称、修饰符、构造函数、成员变量、方法等信息。

        例如,通过Class对象,我们可以通过以下方式获取Test类的名称:

Class clazz = Test.class;
String className = clazz.getName();

2.3.调用方法:可以在运行时调用任意对象的方法。

        使用Java反射机制提供的Method类的实例来调用对象的方法,例如,我们可以通过以下方式来调用Test类的test()方法:

Class clazz = Test.class;
Object obj = clazz.newInstance(); // 创建对象
Method method = clazz.getMethod("test", String.class);
method.invoke(obj, "hello"); // 调用test方法,并传入一个字符串参数

2.4.修改成员变量:可以在运行时修改对象的成员变量。

        使用Java反射机制提供的Field类的实例来修改对象的成员变量。例如,我们可以通过以下方式来修改Test类的name字段的值:

Class clazz = Test.class;
Object obj = clazz.newInstance(); // 创建对象
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "张三"); // 修改name字段的值

2.5.创建对象:可以在运行时通过构造函数来创建对象。

         使用Java反射机制提供的Constructor类的实例来创建对象。例如,我们可以通过以下方式来创建一个Test类的对象:

Class clazz = Test.class;
Constructor constructor = clazz.getConstructor(String.class, Integer.class);
Object obj = constructor.newInstance("张三", 18);

3.但是反射也存在一些缺点和限制,比如:

  • 反射的操作比较耗时,可能会影响程序性能。
  • 反射可能会破坏程序的封装性和安全性。
  • 由于泛型的类型擦除,反射无法获取泛型的实际类型。
  • 反射无法访问编译时不存在的方法或成员变量。

4.反射常用方法 

1.获取Class对象:

Class.forName()方法或对象.getClass()方法获取一个类的Class对象 或.class方法
2.获取构造函数:Class.getConstructor()方法获取一个类的公共构造函数
Class.getDeclaredConstructor()方法获取一个类的任意构造函数
Constructor.newInstance()方法创建一个类的对象
3.获取方法:Class.getMethod()方法获取一个类的公共方法
Class.getDeclaredMethod()方法获取一个类的任意方法
Method.invoke()方法调用一个方法
4.获取字段:Class.getField()方法获取一个类的公共字段
Class.getDeclaredField()方法获取一个类的任意字段
Field.get()和Field.set()方法获取或设置一个字段的值
5.修改访问控制:setAccessible()方法可以取消Java的访问控制,从而访问私有的构造函数、方法或字段。
6.获取类的信息:Class.getName()方法获取类的名称
Class.getModifiers()方法获取类的修饰符
Class.getConstructors()方法获取类的公共构造函数
Class.getDeclaredConstructors()方法获取类的任意构造函数
Class.getMethods()方法获取类的公共方法
Class.getDeclaredMethods()方法获取类的任意方法
Class.getFields()方法获取类的公共字段
Class.getDeclaredFields()方法获取类的任意字段
7.创建数组:使用Array.newInstance()方法可以在运行时创建一个数组。

 二、日期和时间API

获取当前日期和时间:LocalDateTime now = LocalDateTime.now(); 

 1.创建日期和时间

LocalDate date = LocalDate.of(2023, 5, 8);
//创建一个日期
LocalTime time = LocalTime.of(12, 30, 45, 123);
//创建一个时间

2.常用方法 

LocalDate的方法:

now():返回当前的日期和时间。
getYear():获取日期的年份。

getMonth():获取日期的月份。

getDayOfMonth():获取日期的日份。

of():根据指定的年、月、日来获取LocalDate实例。

getDayOfMonth():获取当前日期是当前月的第几天。

getDayOfWeek():获取当前日期是星期几。

plusDays():加上指定的天数,返回新的LocalDate实例。

minusDays():减去指定的天数,返回新的LocalDate实例。
withYear():将当前日期的年份修改为指定的年份,返回新的LocalDate实例。

LocalTime常用的方法:

now():获取当前的时间。

getHour():获取当前时间的小时数。

of():根据指定的小时、分钟、秒来获取LocalTime实例。
getMinute():获取当前时间的分钟数。

getSecond():获取时间的秒数。

plusHours():加上指定的小时数,返回新的LocalTime实例。
minusMinutes():减去指定的分钟数,返回新的LocalTime实例。
withHour():将当前时间的小时数修改为指定的小时数,返回新的LocalTime实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值