歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java6 的類反射瓶頸解決方案

Java6 的類反射瓶頸解決方案

日期:2017/3/1 10:40:23   编辑:Linux編程

在前面的文章中(http://www.linuxidc.com/Linux/2012-01/51222.htm)提到了類反射的瓶頸原因,為了避免大量簡單類型的轉型,大量的數組產生,提出解決方案

首先sun的method.invoke 是不可用了,因為invoke 的使用本來產生了大量的數組為了參數。

  1. invoke(Object obj, Object... args)

解決方案

一般我們類反射通常這樣寫:

Class="testclass" Method="testmethod" args[0].type="int" value="1" arg[1].type="long" value=1 arg[2].type="byte" value="3" return="void"

構建arg 的基礎類

  1. public class arg{
  2. public int int1;
  3. public int int2;
  4. ...
  5. public long long1;
  6. public long long2;
  7. ...
  8. public byte byte1;
  9. ......
  10. }
構建method 的基礎類,第三個參數是代表返回的類型
  1. public abstract class method{
  2. public abstract Object invoke(Object obj, arg args, Object o);
  3. public abstract int invoke(Object obj,arg args, int i);
  4. public abstract void invoke(Object obj, arg args)
  5. public abstract args map(Object parameter);
  6. }

然後分析剛才的arg[]的類型,大小,使用 ClassFileAssembler 生成一個虛擬的method1的類繼承method,直接生成字節碼,並且load到JVM裡
而生成的class源碼應該類似

  1. public class method1 extends method{
  2. public void invoke(Object obj, arg args){
  3. test test = (test)obj;
  4. test.testmethod(args.int1,args.long1,arg.type1);
  5. }
  6. ThreadLocal local = new ThreadLocal();
  7. local.put(args);
  8. public void map(Object parameter){
  9. arg args = (arg)local.get();
  10. args.Long1= 1;
  11. ....
  12. }
  13. }

對args的參數賦值是在虛擬類裡面直接賦值的,同時為了避免object args每次大量生成,可以吧object args 放入threadlocal, 綁定到線程,每次取出直接賦值就可以了。

Copyright © Linux教程網 All Rights Reserved