是否可以在不启动新VM的情况下修改类加载器行为?

时间:2017-03-28 04:34:49

标签: java classloader abstract-syntax-tree

使用Annotation处理器测试AST转换和源代码生成的结果,我有一个类加载器,可以在我使用google的编译测试运行单元测试后加载已编译(修改过的)类并实例化它们,所以我还可以在实例化时对生成/类修改的行为进行单元测试。这是我的类加载器:

public ClassLoader createClassLoader(com.google.testing.compile.Compilation compilation)
            throws InstantiationException,
            IllegalAccessException,
            ClassNotFoundException,
            IOException, NoSuchFieldException {

    return new ClassLoader() {

        final List<JavaFileObject> files = getFiles(compilation);

        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            System.out.println("Loading compiled class: " + name);

            JavaFileObject mc = this.getFileFromName(name, files);

            if (mc != null) {

                try {

                    byte[] bytes = new byte[5000];

                    int len = mc.openInputStream().read(bytes);
                    files.remove(mc);

                    return defineClass(name, bytes, 0, len);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return super.findClass(name);
        }

        private JavaFileObject getFileFromName(String name,
                                               List<JavaFileObject> input) {
            return input.stream().filter(object -> {
                final URI normalize = object.toUri().normalize();
                String curr = normalize.toString();
                curr = curr.substring(("mem:///CLASS_OUTPUT/").length(),
                        curr.length() - ".class".length());
                curr = curr.replace("/", ".");
                return Objects.equals(curr, name);
            }).findAny().orElse(null);
        }
    };

这有效,我可以实例化我在单元测试中编译的类文件中的对象:

ClassLoader loader = (new CompilerUtil().createClassLoader(compilation));
Class clazz = loader.loadClass(fullName);
Object instance = clazz.newInstance();

我希望能够修改现有的一个,以便我可以运行编译任务并让它识别在使用&#34; -printsource&#34;运行编译测试时动态加载的类。 args等..

它是单元测试的,所以反射/仪表很好,想知道是否有一种简单的方法可以用当前的类加载器加载类还是可以替换它?

0 个答案:

没有答案