反射
java反射可以从配置文件中得到类的路径,创建一个属于这个类的Class对象,这样的对象一个类只有一个,这个对象就像一面镜子,通过这面镜子可以看到类的全部信息。
Properties properties = new Properties();
properties.load(new FileInputStream("D:\\project\\JavaTest\\javaCode\\src\\re.properties"));
String classfullpath= properties.get("classfullpath").toString();
Class cls = Class.forName(classfullpath);
Class类型就像其他类一样,通过它可以创建某个类的对象。
Cat cat= (Cat)cls.newInstance();
在java中,万物皆对象,类的字段,方法都可以看作一个类,因此把类的方法提取出来,过程是与正常创建对象相反的
Method method1 = cls.getMethod(method);
method1.invoke(cat);
java编译后会产生这个类的字节码文件,jvm调用类加载器ClassLoader的loadClass创建一个Class对象存在堆中,类只会被加载一次;在运行阶段,Cat cat=new Cat()就会使用该对象创建一个对象,并调用方法。
反射是解释执行,对执行速度有影响。可以发现Method和Field、Constructor类都继承AccessibleObject,里面有个方法setAccessible,作用是启动和禁用访问安全检查的开关。参数设置为True就可以关闭检查,提升速度。
简单工厂模式
简单来说就是工厂类负责提供产品,这个产品继承自同一个父类,这样在工厂中就可以根据不同需求创建不同类型的产品,实现多态。
详情
这几天遇到的问题:
- matplotlib绘制饼图标签重叠的问题。只能根据实际需求手动调整标签位置。我的调整如下
patch,text1=plt.pie(nums,
labels=schools,
shadow=False, # 无阴影设置
startangle=90, # 逆时针角度设置
pctdistance=0.6) # 数值距圆心半径倍数距离
# patches饼图的返回值,text1饼图外label的文本,text2饼图内部的文本
for i in range(6):
text1[-(i + 1)].set_position((0 + i * 0.1, 1.1 + i * 0.05))
实际发现最后6个因为占比小挤在一起的标签往右上方排列的效果最好。还有set_x,set_y方法。
2. matplotlib绘制饼图显示不全的问题。设置大小即可。
plt.figure(figsize=(6, 7))
3. elasticsearch统计求和
"aggs": {
"sum_reply": {
"sum": {
"field": "reply_count"
}
},
}
- 寻找主帖的递归实现
- es时间滞后问题。一个大Bug,如果不是偶然发现真的不知道有这个问题。以为logstash会把mysql的值原封不动地迁移到es中。
详见这篇博客
因为我的数据已经全部导入es中,所以只有在检索的时候指定时区。因为还要把时间显示出来,所以还要对检索出的时间做处理。
def time_handler(target_time):
_date = datetime.datetime.strptime(target_time,"%Y-%m-%dT%H:%M:%S.%fZ")
eta = (_date + datetime.timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
return eta
- 使用django-crontab定时处理有个问题,就是我用matplotlib绘图的时候没有保存本地文件,导致后续写docx文档的时候找不到文件,其余的发送邮箱都没问题。直接用python执行也没问题。crontab任务的日志在/var/spool/mail/root查看。最后只能与django分离,独立写crontab任务运行脚本,可以顺利执行。