我有一点想要编辑的Java(它是一个Minecraft mod)我反编译了.class文件(用jd-gui),编辑了我想要的东西,然后尝试重新编译(用javac)。
我收到了数百个错误。我只编辑了几行,所以我尝试编译未经编辑的.java,就像它们来自反编译器一样。同样的事情,数百个错误。
对Java知之甚少,所以我确信我犯了一些错误。为什么不能编译尚未从有效的.class文件编辑的代码?
以下是我得到的一个示例:
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;
^
以及一些代码:
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;
}
}
}
答案 0 :(得分:2)
听起来原始的Java编译被混淆了。混淆器使用许多技巧来使反向工程代码变得困难。例如,在.class文件中包含方法和字段名称是合法的,这些文件是Java源代码中的保留字(for
,if
等)。如果混淆器使用这样的技巧,那么当你反编译时在.class文件中,Java源代码是非法的,因为您不能将这些保留字用作方法或字段名称。