创建包装器类以捕获方法执行时间

时间:2015-12-13 22:53:14

标签: java wrapper

对于我的任务,我必须创建一个程序,将一个类包装到另一个类文件(clsB.java)中。我为它提供了我的基本类(cls.java)的名称,它以一种计算所有方法的方式来计算它们在工作时经过的时间。它应该是这样的:

int get(int arg) {
    long startTime = System.currentTimeMillis();
    parent::get(...) = 
    System.out.println("Time passed = " + System.currentTimeMillis() - startTime);
}

我尝试使用Class对象并提取cls.java代码的所有部分,以便将它们简单地写入我创建的文件中,但我无法找到任何方法来添加具有任何参数的方法。有没有办法让它成为我的方式或者我应该寻找其他一些想法?提前感谢您的所有答案:)

2 个答案:

答案 0 :(得分:0)

我将使用String类作为示例。

包装方法

 public static void getClassToWrap(Class<?> cls) {
    try {
        Object obj = cls.newInstance();
        obj = "helloWorld";
        Method reflectedMethod = cls.getDeclaredMethod("hashCode");
        System.out.println(reflectedMethod.invoke(obj));
    } catch (Exception ex) {
        System.out.println("stack trace");
        ex.printStackTrace();
    }
}

计时器方法

public static long getMethodTimes(Class c) {
        long startTime = currentTimeMillis();
        getClassToWrap(c);
        System.out.println("Time passed = " + (currentTimeMillis() - startTime));
        System.out.println(startTime);
        return startTime;
    }

使用main method()

getMethodTimes(String.class);中执行 编辑以响应OP

How can I dynamically create a new .java file from a Java program?

  

您无法使用反射API创建新类或方法。   它们不是为此而设计的。 (Class和Method API适用于   以动态方式对对象实例执行操作。)

     

如果你想动态创建新代码,有两个基本的   这样做的方法:

     

生成Java源代码,将其写入文件,使用Java编译器   将其编译为字节码文件,然后加载字节码。 (那里   是用于在JVM中运行Java编译器的标准API   运行应用程序。)

     

使用BCEL或等效文件从头开始构建字节码文件   然后加载字节码。

     

这两种方法都很棘手并且计算成本很高。 BCEL   方法特别棘手,因为你需要了解很多   关于JVM来完成这项工作。

答案 1 :(得分:0)

只需在原始课程上致电super

class Original
{
    public int add(int a, int b)
    {
        return a+b;
    }
}

class Wrapper extends Original
{
    public int add(int a, int b)
    {
        long startTime = System.currentTimeMillis();
        int r = super.add(a,a);
        System.out.println("Time passed = " + System.currentTimeMillis() - startTime);
        return r;
    }   
}