我正在使用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(之前,之后)一样应用此解决方案?
答案 0 :(得分:1)
我认为您的方法的第一个问题是当您尝试使用interface
修改Javassist
时,您尝试重新定义已加载的接口类加载器。
一个选项可能是做一些类加载器技巧:创建一个没有加载现有接口的新classloader
(父级是系统类加载器)并且有Javassist
加载(使用带有aCtClass.toClass()
参数的ClassLoader
方法)。然而,事实并非如此,因为正确管理多个ClassLoader
并不容易。
可能有更好的方法来实现您的目标,创建新类可能是更好的设计。您可以创建一个新类来实现您需要的所有内容,然后扩展所需的接口。
此外,我建议您同时查看dynamic proxies ,这也是一个选项。他们最大的优势是你不需要任何第三方库来创建它们。