forked from SteamWar/SteamWar
Remove Reflection
This commit is contained in:
@@ -43,6 +43,8 @@ public class ClassPatcher {
|
||||
/** Pre-computed set of targeted internal names for fast filtering. */
|
||||
private final Set<String> targets;
|
||||
|
||||
private final Set<String> targetsPublicConstructor;
|
||||
|
||||
public ClassPatcher(List<AccessWidenerEntry> entries) {
|
||||
this.entries = entries;
|
||||
this.targets = entries.stream()
|
||||
@@ -53,6 +55,10 @@ public class ClassPatcher {
|
||||
return Stream.of(s, s.substring(0, index));
|
||||
})
|
||||
.collect(Collectors.toSet());
|
||||
this.targetsPublicConstructor = entries.stream()
|
||||
.filter(entry -> entry.directive().equals("transitive-extendable"))
|
||||
.map(AccessWidenerEntry::target)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,7 +72,7 @@ public class ClassPatcher {
|
||||
try {
|
||||
ClassReader cr = new ClassReader(classBytes);
|
||||
ClassWriter cw = new ClassWriter(cr, 0);
|
||||
cr.accept(new ClassTransformer(cw, className, entries), ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
|
||||
cr.accept(new ClassTransformer(cw, className, entries, targetsPublicConstructor.contains(className)), ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
|
||||
return cw.toByteArray();
|
||||
} catch (Exception e) {
|
||||
LOG.warning("[AccessWidener] Failed to transform " + className + ": " + e.getMessage());
|
||||
|
||||
@@ -30,11 +30,13 @@ public class ClassTransformer extends ClassVisitor {
|
||||
|
||||
private final String internalName;
|
||||
private final List<AccessWidenerEntry> entries;
|
||||
private final boolean appendPublicConstructor;
|
||||
|
||||
public ClassTransformer(ClassVisitor cv, String internalName, List<AccessWidenerEntry> entries) {
|
||||
public ClassTransformer(ClassVisitor cv, String internalName, List<AccessWidenerEntry> entries, boolean appendPublicConstructor) {
|
||||
super(Opcodes.ASM9, cv);
|
||||
this.internalName = internalName;
|
||||
this.entries = entries;
|
||||
this.appendPublicConstructor = appendPublicConstructor;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -44,6 +46,13 @@ public class ClassTransformer extends ClassVisitor {
|
||||
if (!e.targets(internalName) || !"class".equals(e.memberType())) continue;
|
||||
newAccess = applyDirective(e.directive(), newAccess, false);
|
||||
}
|
||||
if (appendPublicConstructor) {
|
||||
MethodVisitor methodVisitor = visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||
methodVisitor.visitMaxs(0, 0);
|
||||
methodVisitor.visitCode();
|
||||
methodVisitor.visitInsn(Opcodes.RETURN);
|
||||
methodVisitor.visitEnd();
|
||||
}
|
||||
super.visit(version, newAccess, name, signature, superName, interfaces);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user