gpt4 book ai didi

java - 枚举加载时编织的方面?

转载 作者:行者123 更新时间:2023-12-01 15:37:54 25 4
gpt4 key购买 nike

使用 AspectJ,我可以使用 aspectOf() 获取方面的单例实例。方法:

MyAspect aspect = Aspects.aspectOf(MyAspect.class);

// now perform post-application startup initialisation, eg:
aspect.setLogService(logging);

有没有办法获取我正在运行的 Java 应用程序中所有方面的列表?我正在使用带有加载时编织的 AspectJ 1.6.7,但可以根据需要升级版本。

应用程序中所有方面的列表将允许我在启动时将依赖项注入(inject)到它们中。

最佳答案

一个相当hackish的解决方案,但仍然是一个解决方案:从类路径手动加载aop.xml文件并解析它以获取方面类名:

final Enumeration<URL> urls =
getClass().getClassLoader().getResources("META-INF/aop.xml");

final Collection<String> aspectNames = new ArrayList<String>();

for (final URL url : urls)
{
final Stream xml = url.openStream();

final DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
docBuilderFactory.setValidating(false);
docBuilderFactory.setNamespaceAware(false);

final XPath xpath = XPathFactory.newInstance().newXPath();
final Document aspectXml = docBuilderFactory.newDocumentBuilder().parse(xml);
final XPathExpression selector = xpath.compile("//aspect/@name");

final NodeList matches =
(NodeList) selector.evaluate(aspectXml, XPathConstants.NODESET);

for (int i = 0; i < matches.getLength(); i++)
{
aspectNames.add(matches.item(i).getNodeValue());
}
}

然后可以像这样获取方面实例:

for (final String className : aspectNames) 
{
final Class<?> aspectClass = Class.forName(className);
final Object aspect = Aspects.aspectOf(aspectClass);

// finally (!) do the initialisation on the aspect itself:
aspect.setLogService(logging);
}

关于java - 枚举加载时编织的方面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589088/

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