@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EpEnableSetNull {
}
自定义注解关注点:注解的作用域和注解类型保留的生命周期
@ElementType 作用域public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
@Retention生命周期
@Retention定义了改Annotation被保留的时间长短:
1、某些Annotation仅出现在源代码中,而被编译器丢弃; 2、一些却被编译在class文件中,注解保留在class文件中,在加载到JVM虚拟机时丢弃,这是默认行为,所以没有用Retention注解的注解,都会采用这种策略; 3、而另一些在class被装载时被读取,注解保留在查询运行期间,此时可以通过反射获取定义在某各类上的所有注解。
作用:表示需要在什么级别保存在该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值有: 1、SOURCE:在源文件中有效(即源文件保留) 2、CLASS:在class文件中有效(即class保留) 3、RUNTIME:在运行时有效(即运行时保留)@Documented
表示该注解是否可以生成到 API文档中。
在该注解使用后,如果导出API文档,会将该注解相关的信息可以被例如javadoc此类的工具文档化。 注意:Documented是一个标记注解,没有成员。
@Inherited使用@Inherited定义的注解具备继承性。
假设一个注解在定义时,使用了@Inherited,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解。
一个类A被注解了,那么另外一个类B,继承了A类,B类能够继承到A类中,的注解 (即被@Inherited注解过的注解) 。
Python import osimport os import os.path as op import os.system as ost #os库是Python标准库,包含几百个函数,常用路径操作、进程管理、环境参数等几类。os.path子库以path为入口,用于操作和处理文件路径。 # 路径操作:os.path子库,处理文件路径及信息 # 进程管理:启动系统中其他程序 # 环境参数:获得系统软硬件信息等环境参数 op.abspath(path) # 返回path在当前系统中的绝对路径 op.normpath(path) # 归一化path的表示形式,统一用\分隔路径 op.relpath(path) # 返回当前程序与文件之间的相对路径 (relative path) op.dirname(path) # 返回path中的目录名称 op.basename(path) # 返回path中最后的文件名称 op.join(path, *paths) # 组合path与paths,返回一个路径字符串 op.exists(path) # 判断path对应文件或目录是否存在,返回True或False op.isfile(path) # 判断path所对应是否为已存在的文件,返回True或False op.isdir(path) # 判断path所对应是否为已存在的目录,返回True或False op.getatime(path) # 返回path对应文件或目录上一次的访问时间 op.getmtime(path) # 返回path对应文件或目录最近一次的修改时间 op.getctime(path) # 返回path对应文件或目录的创建时间 op.getsize(path) # 返回path对应文件的大小,以字节为单位 ost(command) # 执行程序或命令command,在Windows系统中,返回值为cmd的调用返回信息 os.chdir(path) # 修改当前程序操作的路径 os.getcwd() # 返回程序的当前路径 os.getlogin() # 获得当前系统登录用户名称 os.cpu_count() # 获得当前系统的CPU数量 os.urandom(n) # 获得n个字节长度的随机字符串,通常用于加解密运算import time time.gmtime([secs])
将以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time ,其中 dst 标志始终为零。 如果未提供 secs 或为 None ,则使用 time() 所返回的当前时间。 一秒以内的小数将被忽略
time.gmtime() #未传入任何参数时,返回当前UTC时间。 time.gmtime(1) #传入secs,以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time #epoch是时间开始的时间,这取决于平台。对于Unix,epoch是1970年1月1日00:00:00(UTC)time.localtime([secs])
获取当地时间 。如果未提供 secs 或为 None ,则使用由 time() 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 1 。
time.localtime() #未传入任何参数时,返回当前本地时间 time.localtime(1) #传入secs,以自 epoch 开始的秒数表示的时间转换为当地的 struct_timetime.strftime(format[, t])
转换一个元组或 struct_time 表示的由 gmtime() 或 localtime() 返回的时间到由 format 参数指定的字符串。如果未提供 t ,则使用由 localtime() 返回的当前时间。 format 必须是一个字符串。如果 t 中的任何字段超出允许范围,则引发 ValueError 。
python中时间日期格式化符号以下指令可以嵌入 format 字符串中,被 strftime() 结果中的指示字符替换: %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(0-12) %M 分钟数(0-59) %S 秒(00-59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示(e.g Thu Dec 10 09:54:27 2020) %j 年内的一天(001-366) %p 本地A.M.或P.M.的等价符 %U 一年中的星期数(00-53)星期天为星期的开始 %w 星期(0-6),星期天为星期的开始 %W 一年中的星期数(00-53)星期一为星期的开始 %x 本地相应的日期表示(e.g 12/10/20) %X 本地相应的时间表示(e.g 09:58:15) %Z 当前时区的名称(e.g 中国标准时间) %% %号本身
import time
print(time.strftime("1. %Y-%m-%d %H:%M:%S",time.localtime()))
print(time.strftime("2. %Y-%m-%d is %A",time.localtime()))
print(time.strftime("3. 十二小时制时间是:%Y-%m-%d %I:%M:%S%p",time.localtime()))
print(time.strftime("4. 现在是: %Z %c",time.localtime()))
print(time.strftime("5. 现在是: %Z %a %b %d %I:%M:%S%p",time.localtime()))
print(time.strftime("6. %Y-%m-%d是%B,这是%Y一年的第%j天",time.localtime()))
# %U 一年中的星期数(00-53)星期天为星期的开始
print(time.strftime("7. %Y-%m-%d是%A,这是%Y一年的第%U周",time.localtime(1607221844)))
# %W 一年中的星期数(00-53)星期一为星期的开始
print(time.strftime("8. %x是是%A,这是%Y一年的第%W周",time.localtime(1607221844)))
print(time.strftime("9. 现在是:%Z %X%p",time.localtime()))
输出结果:
1. 2020-12-10 10:45:00
2. 2020-12-10 is Thursday
3. 十二小时制时间是:2020-12-10 10:45:00AM
4. 现在是: 中国标准时间 Thu Dec 10 10:45:00 2020
5. 现在是: 中国标准时间 Thu Dec 10 10:45:00AM
6. 2020-12-10是December,这是2020一年的第345天
7. 2020-12-06是Sunday,这是2020一年的第49周
8. 12/06/20是是Sunday,这是2020一年的第48周
9. 现在是:中国标准时间 10:45:00AM
日志
设置操作人的IP
import javax.servlet.http.HttpServletRequest;
public class IPUtils {
private IPUtils() {
}
public static final String UNKNOWN = "unknown";
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
}
{
"Content-Type": "application/json;charset=UTF-8",
"X-AUTH-TOKEN": "06216:1b17f849a64d4a2696f46654dbc13c0b"
}



