如何取时间限制?
这个问题是问时间限制的获取,不是问方法。所以我直接回答怎么获取时间限制吧 获取时间限制的方式有很多,常见的有下面这几种: 在代码中添加系统时间的判断 这种方法比较简单,但缺点是无法得到精确的时间限制信息(因为系统时间可能不准确) 通过 HTTP header 的 Last-Modified 字段获取 此字段的格式为 yyyy-mm-dd hh:mm:ss zzzz,其中 zzzz 为时区编码(比如 +08:00 表示北京时间的东八区),我们只需要获得其年、月、日的部分就可以得到近似的时间限制信息了。当资源被修改后,该字段会更新并返回新的时间戳,我们通过对比两次请求的该字段值可以得知资源被修改的时间。由于这个字段总是存在并且只有小幅度变化,所以非常适合作为时间限制的判断依据。
通过其他方式间接判断 如果资源是静态的,我们可以直接从网络请求的头中获取到资源的修改时间;如果是动态的资源(也就是需要从数据库或者其他数据来源取得),我们就需要开发一个加载器的类,该类需要实现 java.lang.reflect.Invokable 接口,从而可以通过反射机制调用目标方法的 void 返回值,这样我们就可以通过程序的方式直接获取到我们想要的信息(当然也可以配合正则匹配等等手段) 如果资源是静态的,那么可以直接通过 URI 的 lastModified() 方法或者 Files 类的 stat() 方法获取文件的 modificationTime() 属性来得到文件被修改的时间;如果是动态的资源,则需要根据加载器类前面所述的方式来获取。
以上都是得到时间限制信息的办法,接下来我们来讨论如何判断是否超过了时间限制。 对于静态的资源来说,我们直接可以通过上面提到的方法得到文件的 modifiedTime() 属性的值,然后与指定的上下文中的时间进行对比就能知道是否过期。对于动态的资源来说,由于我们需要通过程序的方式直接获取到时间信息,所以我们必须先得到目标方法返回的对象,然后再对得到的对象进行时间上的比较。
如果目标方法有明确的返回类型且为非 void,那么我们直接可以将得到的对象与指定上下文中相应类型的变量进行对比,看看是否是同一个实例,如果是同一实例就说明资源没有被刷新,也就是说没有超过时间限制;否则说明资源已经被刷新,已经超过时间限制。 除了上述的方法以外,还有很多其他的方法可以获取时间信息,以上只是列举了常见的情况。