如何使用javassist将接口转换为抽象

时间:2017-08-21 04:54:23

标签: aop javassist

我正在使用javassist库来修改类文件。

我想修改抽象类的接口

例如,

原文:

public interface javax.servlet.Servlet {
 public void init(ServletConfig config) throws ServletException;
} 

修改:

public abstract javax.servlet.Servlet {
    public void init(ServletConfig config) throws ServletException {
        System.out.println(config.getServletContext().getServerInfo());
        callMethod(); // this is implemented original method
    }
} 

我如何像aop(之前,之后)一样应用此解决方案?

1 个答案:

答案 0 :(得分:1)

我认为您的方法的第一个问题是当您尝试使用interface修改Javassist时,您尝试重新定义已加载的接口类加载器。

一个选项可能是做一些类加载器技巧:创建一个没有加载现有接口的新classloader(父级是系统类加载器)并且有Javassist加载(使用带有aCtClass.toClass()参数的ClassLoader方法)。然而,事实并非如此,因为正确管理多个ClassLoader并不容易。

可能有更好的方法来实现您的目标,创建新类可能是更好的设计。您可以创建一个新类来实现您需要的所有内容,然后扩展所需的接口。

此外,我建议您同时查看dynamic proxies ,这也是一个选项。他们最大的优势是你不需要任何第三方库来创建它们。