package japicmp.test.service; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import org.junit.Test; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import static japicmp.test.service.util.Helper.getArchive; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; public class JavassistTest { @Test public void test() throws NotFoundException { ClassPool classPoolOld = new ClassPool(); classPoolOld.appendClassPath(getArchive("japicmp-test-service-v1.jar").getFile().getAbsolutePath()); classPoolOld.appendClassPath(getArchive("japicmp-test-service-impl-v1.jar").getFile().getAbsolutePath()); CtClass oldClass = classPoolOld.get(SubclassAddsNewStaticField.class.getName()); assertThat(oldClass.getSuperclass().getFields().length, is(1)); ClassPool classPoolNew = new ClassPool(); classPoolNew.appendClassPath(getArchive("japicmp-test-service-v2.jar").getFile().getAbsolutePath()); classPoolNew.appendClassPath(getArchive("japicmp-test-service-impl-v2.jar").getFile().getAbsolutePath()); CtClass newClass = classPoolNew.get(SubclassAddsNewStaticField.class.getName()); assertThat(newClass.getSuperclass().getFields().length, is(1)); } @Test public void testMakeClass() throws NotFoundException, IOException { ClassPool classPoolOld = new ClassPool(); classPoolOld.appendClassPath(getArchive("japicmp-test-service-v1.jar").getFile().getAbsolutePath()); classPoolOld.appendClassPath(getArchive("japicmp-test-service-impl-v1.jar").getFile().getAbsolutePath()); classPoolOld.appendSystemPath(); List<CtClass> ctClasses = loadClasses(getArchive("japicmp-test-service-impl-v1.jar").getFile(), classPoolOld); assertThat(ctClasses.get(0).getSuperclass().getFields().length, is(1)); ClassPool classPoolNew = new ClassPool(); classPoolNew.appendClassPath(getArchive("japicmp-test-service-v2.jar").getFile().getAbsolutePath()); classPoolNew.appendClassPath(getArchive("japicmp-test-service-impl-v2.jar").getFile().getAbsolutePath()); classPoolNew.appendSystemPath(); ctClasses = loadClasses(getArchive("japicmp-test-service-impl-v2.jar").getFile(), classPoolNew); assertThat(ctClasses.get(0).getSuperclass().getFields().length, is(1)); } private List<CtClass> loadClasses(File archive, ClassPool classPool) throws IOException, NotFoundException { List<CtClass> classes = new ArrayList<>(); try (JarFile jarFile = new JarFile(archive)) { Enumeration<JarEntry> entryEnumeration = jarFile.entries(); while (entryEnumeration.hasMoreElements()) { JarEntry jarEntry = entryEnumeration.nextElement(); String name = jarEntry.getName(); if (name.contains(SubclassAddsNewStaticField.class.getSimpleName())) { CtClass ctClass = classPool.makeClass(jarFile.getInputStream(jarEntry)); System.out.println(ctClass.getSuperclass().getFields().length); classes.add(ctClass); } } } return classes; } }