gpt4 book ai didi

java - 如何覆盖用 ClassLoader 实例化的类的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:04 25 4
gpt4 key购买 nike

我想创建一个类的对象,并重写它的一些方法。例如:

Foo bar = new Foo(){

public void fighters(){
//some stuff
}

};

问题是:类的名称存储在一个字符串中。我明显的举动是使用 Constructor.newInstance(Object o) 方法创建一个新实例,如下所示:

Class c = cl.loadClass("com.pom.Foo");
Foo f = (Foo) (c.getDeclaredConstructor(String.class).newInstance("Hello!"));

虽然这段代码成功创建了类的新实例,但我现在不知道如何重写它的方法。

有什么建议吗?

最佳答案

我认为您有几个选择,但没有一个是好的,而且在您如何解决遇到的问题时,所有这些都令人发指。

委派包装器

创建一个如下所示的 DelegaingFoo 类:

class DelegatingFoo {

Callable callMe;

public DelegatingFoo(Callable callMe) {
this.callMe = callMe;
}

public void fighters(){
calLMe.call();
}

};

改为实例化它,像上面那样将 Callable 对象传递到构造函数中。这会将您要运行的代码与注入(inject)它的位分开。

使用 JVM 语言

编译为可以通过 javax.script 运行的东西,例如 BeanShell、Groovy 等。根据您最终要执行的操作,这可能是一个可行的选择。

自定义类加载器

如果您可以选择使用替代的类加载器(这会带来自身的问题),这会充满自身的问题,并且会创建一些非常复杂的东西。如果您决定认真考虑这一点,那么查看 OSGi 类加载框架之类的东西可能会给您一些线索(它甚至可能在一定程度上是合适的)。

字节码操作

有一些库可以帮助动态处理字节码/截取/生成/更改:

警告

应该注意的是,以上所有内容都是 hack,随着您深入了解它们,您会越来越堕落。我会尽快让我的架构得到同行评审,因为我会投入资金,用更清晰的方法来处理您正在做的事情。

请记住,您编写的代码应该更易于阅读 - 否则您会给自己(或 future 的项目所有者)带来维护方面的麻烦。

关于java - 如何覆盖用 ClassLoader 实例化的类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961555/

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