import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger; public class DynamicServer {
private static Logger log = Logger.getLogger(DynamicServer.class);
public static Map<String,Class> clazzMap = new HashMap<String,Class>();
public static Map<String,Object> objMap = new HashMap<String,Object>();
public static Map<String,Method> metMap = new HashMap<String,Method>();
public static Map<String,Map<String,String>> typeMap = new HashMap<String,Map<String,String>>(); /**
* 通过反射+缓存高效的调用某个类里面的某个方法
* */
public static Object cacheExce(String clazz,String method,Object[] os,Class[] cs) throws NoSuchMethodException{
try {
int size = 0;
if(cs!=null){
size = cs.length;
} Method m = metMap.get(clazz+"_"+method+"_"+size);//用于区分重载的方法
Object obj = objMap.get(clazz); if(m==null||obj==null){
Class cl = clazzMap.get(clazz);
if(cl==null){
cl = Class.forName(clazz);
clazzMap.put(clazz, cl);//缓存class对象
} if(obj==null){
obj = cl.newInstance();
objMap.put(clazz, obj);//缓存对象的实例
} if(m==null){
m = cl.getMethod(method, cs);
metMap.put(clazz+"_"+method+"_"+size, m);//缓存Method对象
}
}
return m.invoke(obj , os);//动态调用某个对象中的public声明的方法
} catch (Exception e) {
e.printStackTrace();
throw new NoSuchMethodException();
}
} /**
* 通过反射+缓存获取指定类里面 的指定方法的返回类型
* */
public static String cacheType(String clazz,String method) throws ClassNotFoundException{
Map<String,String> clazzs = typeMap.get(clazz);
if(clazzs==null){
Map<String,String> mmap = new HashMap<String, String>();
Class cl = Class.forName(clazz);
Method[] ms = cl.getMethods();//获取某个类里面的所有的公共的方法
for(Method m:ms){
mmap.put(m.getName(), m.getGenericReturnType().toString());//遍历出所有的方法,将方法名和返回类型存在静态的map中(缓存)
}
clazzs = mmap;
typeMap.put(clazz, mmap);
}
return clazzs.get(method);
} }

代码部分应该没啥要说的了吧,注释已经写的很清楚了,剩下的就需要参照jdk文档了。那么现在来扯扯代码之外的技术话题。

一,九个活动,一人一周

其实是这样的。我的新公司,是给电信做运营支撑的,每到节假日都会做一些送流量送话费的活动。这一次,是针对八月份的里约奥运会来的,给新疆那边做了九个活动,什么奥运游泳,奥运射击等等等、、反正就九个了。

本来吧这跟我是一点关系搭不上,但是后来出了点小意外,,离上线还要一周多点的时间,九个活动大家已经开发的快差不多了,突然接到上级的通知开个紧急会议,说活动需要整改,,,说是生产环境为了安全考虑,web应用不可以直接访问数据库,数据库需要放在内网服务器。目前的解决方案就是开发一套内网应用,专门用来做数据库读写操作,然后对外提供接口,供给web应用访问。然后领导接对我说,现在公司大部分人都投入到这期的活动中了,都抽不出时间,有几个新手,也不太放心他们去弄,所以这个艰巨的任务就交给你了,一周能搞定吧? 然后我就恩啊恩啊的答应了。

下了班之后,突然觉得有点不对劲!  一周!!! 九个活动的数据读写操作!! 瞬间崩溃掉了,一周时间还不够我了解九个活动业务上的需求呢。于是赶紧去找领导问问能不能通过其他方式解决,就比如在最外层加个反向代理服务器做个请求转发什么的,这样就不用去改代码了。但是领导的回复是不行。。好吧,只能认栽了。

二,为什么要用反射

第二天过来,向参与活动开发的同事打听了一下情况。一开始是一点思路都没,后来有人提议,让他们提供sql,这样会大大减少我这边的工作量。然后我问了下,发现大部分活动是用jfinal写的,这样的话我就可以直接把他们的Dao层的文件直接拷贝过来了。接下来要做的就是写接口,将方法一一对应起来。于是新的问题来了,每个活动,数据库读写最少有15个方法以上,而且每个方法传的参数都不一样,开发的时候也没有考虑过要整合的问题,所以根本就不存在什么继承,什么多态。这就意味着,我要写接近200个方法与之一一对应,对于我来说,这是写代码以来,最大的灾难!告诉我,这种情况下,除了用反射,我还能怎么办?要我码两百个方法,干脆让我去shi吧。。。

三,性能堪忧

三天之后,算上换行,还有搬砖部分的,累积不超过800行代码结束了这场灾难。接下来的几天,是跟几个开发活动的同事调接口,然后就匆匆上线了。测试的时候感觉还行,但是上线之后,感觉活动打开特别卡。然后我们公司运维查了下服务器性能情况,发现部署后台接口的那台服务器CPU占用率飙到了90%以上。妈的,灾难又来了,肯定是程序出问题了,之前了解过jvm性能监控方面的一些知识,然后百度了一下利用jstack命令打印出堆栈信息分析是那部分代码出的问题。然而,堆栈信息是打印出来了,但是完全看不懂(希望能有个大神指点一下)。没办法最后只好一段代码,一段带代码的测了(感觉应该有更好的方法)。虽然办法有点笨,但最后终于不负所望找到了凶手,原来是反射部分的代码。

四,优化之路

百度了一下,发现在加载类的时候,还有查找和执行方法的时候是很占资源的。想了好一会,觉着可以把这几个比较耗资源的操作缓存起来,这样的话只有在一次调用这个方法的时候比较耗资源,之后除了执行method.invoke方法以外,其他比较好资源的参数,可以直接从缓存中区,应该能缓解一部分压力了吧。光想没用,不如干起来。完了以后测试了一下,执行时间比原来快了接近10倍,而且同一个方法调用次数越多,就越能感觉到差距。

现在项目已经上线了有一段时间了,基本没我啥事了。抽个空分享下那段时间的工作心得,顺便提醒一句,在并发量大的情况下,能不用反射尽量不用!还有,谁告诉我,这种情况下,除了用反射,我还能怎么办???

java反射机制性能优化的更多相关文章

  1. java反射之-性能优化

    在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选 ...

  2. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  3. Java反射机制(转载)

    原文链接:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...

  4. (转载)Java反射机制

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  5. 长篇图解java反射机制及其应用场景

    一.什么是java反射? 在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new 类名()方式来获取该类的对象.也就是说我们需要在写代码的时候(编译期或者编译期之前)就知道我们 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  8. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  9. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

随机推荐

  1. 2013 吉林通化邀请赛 Tutor 有点坑的水题

    计算12个数的和的平均数.四舍五入,不能有后导0. 我的做法是,将答案算出后,乘以1000,然后看个位是否大于等于5,判断是否要进位…… #include<iostream> #inclu ...

  2. poj 2038 Team Rankings 枚举排列

    //poj 2038 //sep9 #include <iostream> #include <algorithm> using namespace std; char s[1 ...

  3. Linux下Apache PHP Mysql默认安装路径

    Apache 假设採用RPM包安装.安装路径应在 /etc/httpd文件夹下 Apache配置文件: /etc/httpd/conf/httpd.conf Apache模块路径: /usr/sbin ...

  4. A Game of Thrones(9) - Tyrion

    Somewhere in the great stone maze(迷宫:迷惑) of Winterfell, a wolf howled. The sound hung over the castl ...

  5. 恩布企业 IM 安卓端 1.3,服务端 1.12 公布

    恩布企业IM的 Android 安卓开源手机client EntboostIM 公布 1.3 版本号.同一时候恩布IM服务端更新至 1.12 版本号; 安卓端主要更新内容: 添加收发手机文件功能: 登 ...

  6. 【PLSQL】绑定变量,活跃SQL,软硬解析解析

    ************************************************************************   ****原文:blog.csdn.net/clar ...

  7. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  8. linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法

    PS查看进程 inux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必 ...

  9. hdu 3790 (最短路径问题dijkstra)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

  10. iOS一些推荐的学习路径发展

    iOS论坛里有朋友要求回答帖子,帖子的标题是: 想学IOS开发高阶一点的东西,从何開始,然后我吧啦吧啦回答写了非常多.既然敲了那么多字,我就把我写的回复也贴到博客里来分享.希望能对大家有帮助.欢迎大家 ...