Java 如何在方面中使用ajc构建参数?

Java 如何在方面中使用ajc构建参数?,java,aspectj,Java,Aspectj,我需要知道方面中我的.jar的名称,以便通过@DeclareParents创建一个字符串字段 我知道我可以将东西传递给ajc编译器,但是实际上可以使用从方面传递的参数吗? 最终结果应该是带有一个附加字段的类,该字段的值为my.jar的名称 更新:建议测试。Gson.jar是类路径上的.jar InputStream r = Gson.class.getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF"); String

我需要知道方面中我的.jar的名称,以便通过@DeclareParents创建一个字符串字段

我知道我可以将东西传递给ajc编译器,但是实际上可以使用从方面传递的参数吗? 最终结果应该是带有一个附加字段的类,该字段的值为my.jar的名称

更新:建议测试。Gson.jar是类路径上的.jar

    InputStream r = Gson.class.getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
    String x = getString(r);
    System.out.println(x);
输出:

Manifest-Version: 1.0

Name: org/aspectj/lang/
Specification-Title: AspectJ Runtime Classes 
Specification-Version: 1.7
Specification-Vendor: aspectj.org
Implementation-Title: org.aspectj.tools
Implementation-Version: 1.7.3
Implementation-Vendor: aspectj.org
Bundle-Name: AspectJ Runtime
Bundle-Version: 1.7.3
Bundle-Copyright: (C) Copyright 1999-2001 Xerox Corporation, 2002 Palo 
  Alto Research Center, Incorporated (PARC), 2003-2009 Contributors. 
  All Rights Reserved.

似乎同一时间只能有一个MANIFEST.MF资源,而AspectJ.jar恰好是类路径上的第一个资源。

我不知道如何做您想要的事情。即使有可能,如果您解压缩JAR并从文件系统加载修改过的类,或者重新打包/重命名JAR,字符串值仍然是相同的。解决方案将是静态的,而不是动态的

无论如何,把这样的信息放进一个打包到JAR中的配置文件,或者甚至直接放进清单文件,怎么样?Maven具有向清单添加信息的功能,Java可以在运行时读取这些信息。我还没有想清楚,更不用说尝试实现这样的东西,但也许这是一种你可以走的路

请随时提出后续问题


更新:您可以避免清单方法,并尝试为每个加载的类直接确定JAR文件,另请参阅

实用程序类:

package de.scrum\u master.util;
导入java.net.URL;
公共类ClassFileHelper{
公共静态URL getClassURL(类clazz){
返回clazz.getResource('/'+clazz.getName().replace('.','/')+“.class”);
}
公共静态字符串getJARFromURL(URL URL){
如果(!url.getProtocol().equals(“jar”))
返回null;
字符串文件名=url.getFile();
fileName=fileName.substring(0,fileName.lastIndexOf(“!”);
fileName=fileName.substring(fileName.lastIndexOf('/')+1);
返回文件名;
}
}
用法:

我在Java+AspectJ项目中尝试了这一点,在该项目中,方面被包装在一个JAR文件中,Java文件存储在一个文件系统目录中。我刚刚向JAR中的一个方面添加了以下建议:

before():执行(公共静态void main(..){
试一试{
Class[]classes={String.Class,this.getClass(),Class.forName(“com.BadReader”)};
对于(班级:班级){
系统输出打印(clazz);
URL classURL=ClassFileHelper.getClassURL(clazz);
System.out.println(classURL);
System.out.println(ClassFileHelper.getJARFromURL(classURL));
System.out.println();
}
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
如您所见,该数组包含

  • JRE引导类(
    String
  • 方面类本身(
    this.getClass()
  • JAR外部Java项目中的类(
    class.forName(“com.BadReader”)
控制台输出:

class java.lang.String
jar:file:/C:/program/Java/jre7/lib/rt.jar/java/lang/String.class
基础类库
类com.SafeReaderAspect
jar:file:/C:/Users/Alexander/Documents/java src/SO_AJ_itd2步骤编译_AspectJ/aspectLib.jar/com/SafeReaderAspect.class
aspectLib.jar
类com.BadReader
文件:/C:/Users/Alexander/Documents/java src/SO_AJ_itd2步骤编译_java/bin/com/BadReader.class
无效的

这就是你想要的吗?

kriegaex,我需要每种类型的信息!。所以我需要在运行时知道类型“MyType”是来自“MyJar1.jar”还是“MyJar2.jar”。我看没有其他可能的办法。我想我可以让Aspectj动态地将一个属性文件写入jar,然后包含所有类型和jar名称,但是我的方法会更漂亮,我也不知道如何实现第二种方法。事实上,我不需要aspectj中的jarname吗?它还需要更高的性能来保持jar类映射的hashmap,然后不断地寻找相关的jar类映射,而不是仅仅读取编译的In字段。不,我认为这要简单得多。我认为您可以首先确定每个类的类加载器以及来自类加载器的清单文件。这样,您就可以在一个JAR中为每一组类找到正确的信息。但是每个.JAR似乎都没有自己的类加载器?我试过了,但没有成功,请看我的更新。查看我的更新,我想我找到了一种动态方法来确定每个加载类的JAR。无需修改清单。:-)