对于我的任务,我必须创建一个程序,将一个类包装到另一个类文件(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代码的所有部分,以便将它们简单地写入我创建的文件中,但我无法找到任何方法来添加具有任何参数的方法。有没有办法让它成为我的方式或者我应该寻找其他一些想法?提前感谢您的所有答案:)
答案 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;
}
}