作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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/
我是一名优秀的程序员,十分优秀!