I have a bit of Java I want to edit (it is a Minecraft mod) I decompiled the .class files (with jd-gui), edited what I wanted to, then attempted to recompile (with javac).
I got hundreds of errors. I only edited a few lines though, so I tried compiling the .java's that were unedited, exactly as they were from the decompiler. Same thing, hundreds of errors.
Know very little about Java, so I am certain I am making some mistake. Why can't it compile code that has not been edited from a valid working .class file?
Here is a sample of what I get:
ReiMinimap.java:451: illegal start of expression
switch (???)
^
ReiMinimap.java:451: ';' expected
switch (???)
^
ReiMinimap.java:451: illegal start of expression
switch (???)
^
ReiMinimap.java:451: illegal start of expression
switch (???)
^
ReiMinimap.java:451: illegal start of expression
switch (???)
^
ReiMinimap.java:452: illegal start of expression
{
^
ReiMinimap.java:452: : expected
{
^
ReiMinimap.java:453: ';' expected
case 49:
^
ReiMinimap.java:453: ')' expected
case 49:
^
ReiMinimap.java:454: illegal start of expression
this.allowCavemap = true;
^
ReiMinimap.java:454: ';' expected
this.allowCavemap = true;
^
ReiMinimap.java:454: illegal start of expression
this.allowCavemap = true;
^
ReiMinimap.java:454: ';' expected
this.allowCavemap = true;
^
ReiMinimap.java:456: orphaned case
case 50:
^
ReiMinimap.java:308: 'try' without 'catch' or 'finally'
try { if (paramMinecraft == null);
^
ReiMinimap.java:499: illegal start of type
else
^
ReiMinimap.java:499: ';' expected
else
^
ReiMinimap.java:501: illegal start of type
this.chatWelcomed = true;
^
ReiMinimap.java:501: <identifier> expected
this.chatWelcomed = true;
^
ReiMinimap.java:501: ';' expected
this.chatWelcomed = true;
^
ReiMinimap.java:501: illegal start of type
this.chatWelcomed = true;
^
ReiMinimap.java:501: <identifier> expected
this.chatWelcomed = true;
^
And some of the code:
if ((!this.chatWelcomed) && (System.currentTimeMillis() < this.chatTime + 10000L))
{
Object localObject1;
for (localObject2 = this.chatLineList.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject1 = (ahe)((Iterator)localObject2).next();
if ((localObject1 == null) || (this.chatLineLast == localObject1)) break;
Matcher localMatcher1 = Pattern.compile("§0§0((?:§[1-9a-d])+)§e§f").matcher(((ahe)localObject1).a);
while (localMatcher1.find())
{
this.chatWelcomed = true;
for (??? : localMatcher1.group(1).toCharArray())
{
switch (???)
{
case 49:
this.allowCavemap = true;
break;
case 50:
this.allowEntityPlayer = true;
break;
case 51:
this.allowEntityAnimal = true;
break;
case 52:
this.allowEntityMob = true;
break;
case 53:
this.allowEntitySlime = true;
break;
case 54:
this.allowEntitySquid = true;
break;
case 55:
this.allowEntityLiving = true;
}
}
}
It sounds like the original Java compilation was obfuscated. There are many tricks that obfuscators use to make it difficult to reverse engineer code. For instance, it is legal to have method and field names in .class files that are reserved words in Java source (for
, if
, etc.) If the obfuscator uses such tricks, then when you decompile the .class file, the Java source is illegal because you can't use those reserved words as method or field names.