从ElementHandle <typeelement>获取类信息

时间:2015-09-16 08:25:16

标签: java templates netbeans reflection wizard

我想为NetBeans创建一个简单的模板向导,该向导将从当前用户项目中获取现有Java类并从中创建新的Java类。为此,我需要从所选类(Java文件)中访问字段和注释数据。

现在,我使用org.netbeans.api.java.source.ui.TypeElementFinder来查找和选择想要的类,但结果我得到了一个ElementHandle而且我不知道如何处理它。我如何从中获取课程信息?

我设法使用此代码片段获取TypeMirror(com.sun.tools.javac.code.Type $ ClassType):

Project project = ...; // from Templates.getProject(WizardDescriptor);
ClasspathInfo ci = ClasspathInfoFactory.infoFor(project, true, true, true);
final ElementHandle<TypeElement> element = TypeElementFinder.find(ci);
FileObject fo = SourceUtils.getFile(element, ci);
JavaSource.forFileObject(fo).runUserActionTask(new Task<CompilationController>() {
    @Override
    public void run(CompilationController p) throws Exception {
        p.toPhase(JavaSource.Phase.RESOLVED);
        TypeElement typeElement = element.resolve(p);
        TypeMirror typeMirror = typeElement.asType();
    }
}, true);

但是这里要做什么?我是否完全以错误的方式解决这个问题?

编辑:

In,回应francesco foresti的帖子:

我尝试了大量不同的Reflection / Classloader方法。我得到了一个创建org.netbeans.api.java.classpath.ClassPath实例并且包含所需类文件的点,但是当我尝试使用从该ClassPath创建的类加载器加载所述类时,我会得到一个ClassNotFoundException 。这是我的代码:

Project project = ...; // from Templates.getProject(WizardDescriptor);
ClasspathInfo ci = ClasspathInfoFactory.infoFor(project, true, true, true);
final ElementHandle<TypeElement> element = TypeElementFinder.find(ci);
FileObject fo = SourceUtils.getFile(element, ci);

ClassPath cp = ci.getClassPath(ClasspathInfo.PathKind.SOURCE);

System.out.println("NAME: " + element.getQualifiedName());
System.out.println("CONTAINS: " + cp.contains(fo));
try {
    Class clazz = Class.forName(element.getQualifiedName(), true, cp.getClassLoader(true));
    System.out.println(clazz.getName());
} catch (ClassNotFoundException ex) {
    Exceptions.printStackTrace(ex);
}

这会产生:

NAME: hr.test.Test
CONTAINS: true
SEVERE [org.openide.util.Exceptions]
java.lang.ClassNotFoundException: hr.test.Test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at org.openide.execution.NbClassLoader.findClass(NbClassLoader.java:210)
    at org.netbeans.api.java.classpath.ClassLoaderSupport.findClass(ClassLoaderSupport.java:113)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:344)

1 个答案:

答案 0 :(得分:0)

为什么不使用普通的旧反射? E.g。

    Class<?> theClazz = Class.forName("com.example.myClass");
    Annotation[] annotations = theClazz.getAnnotations();
    Field[] fields = theClazz.getFields();
    Method[] methods = theClazz.getMethods();
    // from here on, you write a file that happens to be in the classpath,
    // and whose extension is '.java'