测试类
package helloworldref;
import org.osoa.sca.annotations.Reference;
import org.osoa.sca.annotations.Service;
/**
* The HelloWorld service implementation
*/
@Service(HelloWorldService.class)
public class HelloWorldServiceComponent implements HelloWorldService {
HelloWorldService helloWorldService;
public String getGreetings(String name) {
System.out.println("Called getGreetings");
return helloWorldService.getGreetings(name);
}
@Reference
public void setHelloWorldService(HelloWorldService helloWorldService) {
System.out.println("Injected helloWorldService");
this.helloWorldService = helloWorldService;
}
}
假设我们我们已经获取到CtClass;
这里定义 CtClass claName
以此类为例,我们要通过javaassist 获取到这个类中
1.@Reference注释的方法setHelloWorldService中参数HelloWorldService 的名字以及它的包名。
这里定义
CtClass claName =null;
CtMethod[] ms = claName.getMethods();
for (int i = 0; i < ms.length; i++) {
// 获取方法信息
MethodInfo methodInfo = ms[i].getMethodInfo();
// 获取注释信息
AnnotationsAttribute atrr = (AnnotationsAttribute) methodInfo
.getAttribute(AnnotationsAttribute.visibleTag);
if (atrr != null) {
// 参数
if (atrr.toString().equals("@org.osoa.sca.annotations.Reference")) {
if (ms[i].getName().startsWith("set")) {
//通过截取set方法获取参数名字当然这里必须是javabean形式
String msName=ms[i].getName().substring(3);
//输出:msName=helloWorldService
try {
// 获取包,当然还可以通过方式获取参数名字
if (ms[i].getParameterTypes() != null) {
String cc = ms[i].getParameterTypes()[0].getName();
//cc。就是包+类名。
}
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.获取类上面的自定义注解
@Service(HelloWorldService.class)注释里的HelloWorldService.class
其实就是一句话
Service annotations=(Service) claName .getAnnotation(Service.class);
然后 :annotations.方法
妈妈咪。打字好累。。。。先写到这吧