gpt4 book ai didi

java协助创建动态类及其对象

转载 作者:行者123 更新时间:2023-12-01 15:23:18 28 4
gpt4 key购买 nike

我正在尝试创建一个动态类及其对象,并尝试使用对象调用动态类的方法,但出现以下错误

java.lang.ClassNotFoundException: Eval

这是我的代码,请提出任何更改以使其成功运行

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtNewMethod;
public class DyanamicClass {
/**
* @param args
*/
public static void main (String[] args) throws Exception {

createClass();
Object obj=createObject();
Object[] actualParams = new Object[] { new Double(17) };
callMethod("eval", obj,actualParams);
}

public static void createClass()
{
ClassPool pool = ClassPool.getDefault();

CtClass evalClass = pool.makeClass("Eval");

try {
evalClass.addMethod(
CtNewMethod.make("public double eval (double x) { return x ; }", evalClass));

} catch (CannotCompileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static Object createObject()
{
Object obj=null;
try {
Class clazz = Class.forName("Eval");
obj=clazz.newInstance();

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return obj;
}

public static void callMethod(String name,Object obj,Object [] actualParams)
{
Class[] formalParams = new Class[] { double.class };
double result;
try {
Class clazz=Class.forName("Eval");

Method meth = clazz.getDeclaredMethod(name, formalParams);

result = ((Double) meth.invoke(obj, actualParams)).doubleValue();
System.out.println(result);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

}

最佳答案

我在 Javassist 的实现中测试了一些东西。了解我不理解这个库,但我的假设是 Class.forName() 使用的 ClassLoader (可能是当前线程上下文类加载器 - 需要检查)无法找到 Eval 的类文件,因为它没有有关其类路径的信息。我非常确定 javassist 具有您需要为该类设置的 ClassPath 信息,以便普通的 ClassLoader 能够找到其类文件信息。此外,您可能需要将类文件保存到javassist提供的文件中。

但是,作为解决方法,请执行以下操作(请注意,javassist 表示在 CtClass 上调用 toClass() 后,无法再次使用它)。

CtClass ct =ClassPool.getDefault().getCtClass("Eval");
System.out.println(ct);
Class cl = ct.toClass();
Object o = cl.newInstance();
Method m = cl.getDeclaredMethod("eval", new Class[]{double.class});
Object res = m.invoke(o, 56);
System.out.println(res);
System.out.println(cl);
System.out.println(Arrays.toString(cl.getDeclaredMethods()));

关于java协助创建动态类及其对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10548389/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com