Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
6f9791455d
@ -50,12 +50,14 @@ public class CompareByteCodeBehaviour {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compareMethodBehaviour(Class<?> class1, Class<?> class2){
|
public boolean compareMethodBehaviour(Class<?> class1, Class<?> class2){
|
||||||
try {
|
try {
|
||||||
this.sortMethods(class1, class2);
|
this.sortMethods(class1, class2);
|
||||||
// Create instances
|
// Create instances
|
||||||
Constructor<?> constructor1 = class1.getDeclaredConstructor();
|
Constructor<?> constructor1 = class1.getDeclaredConstructor();
|
||||||
Constructor<?> constructor2 = class2.getDeclaredConstructor();
|
Constructor<?> constructor2 = class2.getDeclaredConstructor();
|
||||||
|
constructor1.setAccessible(true);
|
||||||
|
constructor2.setAccessible(true);
|
||||||
Object obj1 = constructor1.newInstance();
|
Object obj1 = constructor1.newInstance();
|
||||||
Object obj2 = constructor2.newInstance();
|
Object obj2 = constructor2.newInstance();
|
||||||
|
|
||||||
@ -71,6 +73,9 @@ public class CompareByteCodeBehaviour {
|
|||||||
Method method1 = methods1[i];
|
Method method1 = methods1[i];
|
||||||
Method method2 = methods2[i];
|
Method method2 = methods2[i];
|
||||||
|
|
||||||
|
method1.setAccessible(true);
|
||||||
|
method2.setAccessible(true);
|
||||||
|
|
||||||
|
|
||||||
// Test with some sample inputs
|
// Test with some sample inputs
|
||||||
Object[] testInputs = getTestInputs(method1.getParameterTypes());
|
Object[] testInputs = getTestInputs(method1.getParameterTypes());
|
||||||
@ -78,19 +83,17 @@ public class CompareByteCodeBehaviour {
|
|||||||
Object result1 = method1.invoke(obj1, testInputs);
|
Object result1 = method1.invoke(obj1, testInputs);
|
||||||
Object result2 = method2.invoke(obj2, testInputs);
|
Object result2 = method2.invoke(obj2, testInputs);
|
||||||
|
|
||||||
/*
|
|
||||||
if (!result1.equals(result2)) {
|
if (!result1.equals(result2)) {
|
||||||
System.out.println("Methods " + method1.getName() + " do not produce the same result");
|
return false;
|
||||||
} else {
|
|
||||||
System.out.println("Methods " + method1.getName() + " produce the same result");
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (InstantiationException | IllegalAccessException |
|
} catch (InstantiationException | IllegalAccessException |
|
||||||
NoSuchMethodException | InvocationTargetException e) {
|
NoSuchMethodException | InvocationTargetException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object[] getTestInputs(Class<?>[] parameterTypes) {
|
private static Object[] getTestInputs(Class<?>[] parameterTypes) {
|
||||||
|
@ -39,8 +39,10 @@ public class CompareByteCodeSyntax {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (Method method1 : methods1) {
|
for (Method method1 : methods1) {
|
||||||
|
method1.setAccessible(true);
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (Method method2 : methods2) {
|
for (Method method2 : methods2) {
|
||||||
|
method2.setAccessible(true);
|
||||||
if (compareMethod(method1, method2)) {
|
if (compareMethod(method1, method2)) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@ -76,8 +78,10 @@ public class CompareByteCodeSyntax {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (Field field1 : fields1) {
|
for (Field field1 : fields1) {
|
||||||
|
field1.setAccessible(true);
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (Field field2 : fields2) {
|
for (Field field2 : fields2) {
|
||||||
|
field2.setAccessible(true);
|
||||||
if (compareField(field1, field2)) {
|
if (compareField(field1, field2)) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
|
37
src/test/java/ByteCode/FileClassLoader.java
Normal file
37
src/test/java/ByteCode/FileClassLoader.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package ByteCode;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class FileClassLoader extends ClassLoader {
|
||||||
|
private final String classFilePath;
|
||||||
|
|
||||||
|
public FileClassLoader(String classFilePath) {
|
||||||
|
this.classFilePath = classFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||||
|
try {
|
||||||
|
byte[] classData = loadClassData();
|
||||||
|
return defineClass(name, classData, 0, classData.length);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ClassNotFoundException("Class not found", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] loadClassData() throws IOException {
|
||||||
|
File file = new File(classFilePath);
|
||||||
|
try (FileInputStream fis = new FileInputStream(file);
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = fis.read(buffer)) != -1) {
|
||||||
|
baos.write(buffer, 0, bytesRead);
|
||||||
|
}
|
||||||
|
return baos.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,39 @@
|
|||||||
package ByteCode;
|
package ByteCode;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
public class TestAll {
|
public class TestAll {
|
||||||
|
CompareByteCodeBehaviour byteCodeBehaviourComparer;
|
||||||
|
public TestAll(){
|
||||||
|
byteCodeBehaviourComparer = new CompareByteCodeBehaviour();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testByteCode(String classPath1, String classPath2, String className){
|
||||||
|
try {
|
||||||
|
FileClassLoader classLoader1 = new FileClassLoader(classPath1);
|
||||||
|
FileClassLoader classLoader2 = new FileClassLoader(classPath2);
|
||||||
|
|
||||||
|
Class<?> class1 = classLoader1.findClass(className);
|
||||||
|
Class<?> class2 = classLoader2.findClass(className);
|
||||||
|
|
||||||
|
assertTrue(CompareByteCodeSyntax.haveSameBehavior(class1, class2));
|
||||||
|
assertTrue(byteCodeBehaviourComparer.compareMethodBehaviour(class1, class2));
|
||||||
|
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEmptyClass() throws Exception {
|
||||||
|
String classPath1 = "src/test/resources/basicClasses/emptyClass.class";
|
||||||
|
String classPath2 = "src/test/resources/basicClasses/emptyClass.class";
|
||||||
|
String className = "emptyClass";
|
||||||
|
|
||||||
|
testByteCode(classPath1, classPath2, "emptyClass");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user