在Java程序中执行Java代码

问题描述 投票:6回答:4

我想创建一个应用程序,例如测量某个代码块的执行时间。在这种情况下,它应该有这样的结构:

public static long measureExecution(String code){
    long start = System.nanoTime();
    executeCode(code); // <----
    long time = System.nanoTime() - start;

    return time;
}

我对箭头指定的方法很好奇,我需要某种占位符。该方法应该如何实施?甚至可以在运行Java应用程序中执行自定义Java代码吗?

我认为可以通过某种覆盖其他方法体来完成,但我无法弄清楚如何。

谢谢你的意见!

java runtime
4个回答
4
投票

你可以通过Runnable

public static long measureExecution(Runnable code) {
    long start = System.nanoTime();
    code.run();
    long time = System.nanoTime() - start;
    return time;
}

在调用方法的位置,使用匿名内部类来包装要测量的代码:

long time = measureExecution(new Runnable() {

    @Override
    public void run() {
        System.out.println("Do something");
    }
});

(如果您使用的是Java 8,则可以使用lambda表达式而不是匿名内部类,这将使代码更短且更易于阅读)。


1
投票

您可以使用OpenHFT / Java-Runtime-Compiler:

https://github.com/OpenHFT/Java-Runtime-Compiler

此外,您可以使用ToolProvider类(编译器API),因为java 1.6:

private Path compileJavaFile(Path javaFile, String className) {
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, javaFile.toFile().getAbsolutePath());
    return javaFile.getParent().resolve(className);
}

0
投票

您可以使用Dynamic Proxy来包装您的方法调用,这里是一个示例:

首先,您需要创建InvocationHandler类:

public class MyInvocationHandler implements InvocationHandler {
private Object target;

public MyInvocationHandler(Object target) {
    this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
    System.out.println("About to invoke " + method + "\n   with argument " + args);
    Object rv = method.invoke(target, args);
    System.out.println("   Call returned " + rv);// here you could print the time instead
    return rv;
}
}

然后创建一个工厂来获取对象并使用先前创建的代理将其包装。

public class MyFactory {
public static MyInterface getMyInterface() {
    MyInterface mc = new MyClass();

    InvocationHandler h = new MyInvocationHandler(mc);

    MyInterface mi = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
            new Class[] { MyInterface.class }, h);
    return mi;
}
}

希望对你有所帮助。


-2
投票

这是你想表达的想法吗?

public static void main(String[] args) { 
  long start1=System.nanoTime(); 
  long t=(1+100000)*10000/2; 
  System.out.println(t); 
  long start2=System.nanoTime();
  long time=start2-start2; 
  System.out.println(time); 
}
© www.soinside.com 2019 - 2024. All rights reserved.