Generate class using javassist

This commit is contained in:
Shevchik
2014-01-08 08:08:36 +04:00
parent d8afbad96b
commit 459f8b0371
283 changed files with 36 additions and 35805 deletions

View File

@@ -52,9 +52,12 @@ public class Chairs extends JavaPlugin {
return vehiclearrowclass;
}
GenVehicleArrowClass genvehiclearrow = new GenVehicleArrowClass();
@Override
public void onEnable() {
log = this.getLogger();
log = this.getLogger();
//load vehiclearrowclass
try {
World world = getServer().getWorlds().get(0);
Arrow arrow = world.spawnArrow(new Location(world, 0, 0, 0), new Vector(0, 0, 0), 0, 0);
@@ -64,7 +67,7 @@ public class Chairs extends JavaPlugin {
getHandle.setAccessible(true);
Class<?> entityarrow = getHandle.invoke(arrow).getClass();
Class<?> craftserver = getServer().getClass();
vehiclearrowclass = new GenVehicleArrowClass(this).genAndLoadClass(arrowclass, entityarrow, craftserver);
vehiclearrowclass = genvehiclearrow.genAndLoadClass(arrowclass, entityarrow, craftserver);
arrow.remove();
} catch (Exception e) {
e.printStackTrace();
@@ -105,6 +108,7 @@ public class Chairs extends JavaPlugin {
chairEffects.cancelPickup();
chairEffects = null;
log = null;
genvehiclearrow = null;
vehiclearrowclass = null;
psitdata = null;
}

View File

@@ -1,94 +1,40 @@
package com.cnaude.chairs;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.bukkit.Bukkit;
import org.bukkit.entity.Vehicle;
import org.apache.bcel.Constants;
import org.apache.bcel.generic.ALOAD;
import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.InstructionConstants;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.InvokeInstruction;
import org.apache.bcel.generic.MethodGen;
import org.apache.bcel.generic.Type;
import javassist.CannotCompileException;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtNewConstructor;
import javassist.NotFoundException;
public class GenVehicleArrowClass {
private File datafolder;
public GenVehicleArrowClass(Chairs plugin)
public Class<?> genAndLoadClass(String arrowclass, Class<?> entityarrow, Class<?> craftserver) throws IOException, ClassNotFoundException, NotFoundException, CannotCompileException
{
this.datafolder = plugin.getDataFolder();
}
public Class<?> genAndLoadClass(String arrowclass, Class<?> entityarrow, Class<?> craftserver) throws IOException, ClassNotFoundException {
ClassGen cg = new ClassGen(
"VehicleArrow",
arrowclass,
"<generated>",
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
new String[]{"org.bukkit.entity.Vehicle"}
);
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = new InstructionList();
MethodGen mg = new MethodGen(
Constants.ACC_PUBLIC,
Type.VOID,
new Type[] { Type.getType(craftserver), Type.getType(entityarrow) },
new String[] { "server", "entity" },
"<init>",
"VehicleArrow",
il,
cp
);
InstructionFactory factory = new InstructionFactory(cg);
il.append(new ALOAD(0));
il.append(new ALOAD(1));
il.append(new ALOAD(2));
InvokeInstruction ii = factory.createInvoke(
arrowclass,
"<init>",
Type.VOID,
new Type[] {Type.getType(craftserver), Type.getType(entityarrow)},
Constants.INVOKESPECIAL
);
il.append(ii);
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
cg.getJavaClass().dump(datafolder+File.separator+"VehicleArrow.class");
File arrowfile = new File(datafolder+File.separator+"VehicleArrow.class");
InputStream arrwoinputstrean = new FileInputStream(arrowfile);
File jarfile = new File(datafolder+File.separator+"VehicleArrow.jar");
jarfile.delete();
final ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(jarfile));
ZipEntry entry = new ZipEntry(arrowfile.getName());
zipout.putNextEntry(entry);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = arrwoinputstrean.read(buffer)) != -1) {
zipout.write(buffer, 0, bytesRead);
}
zipout.closeEntry();
arrwoinputstrean.close();
zipout.close();
URL url = jarfile.toURI().toURL();
URL[] urls = new URL[]{url};
URLClassLoader cl = new URLClassLoader(urls);
Class<?> vehiclearrowclass = cl.loadClass("VehicleArrow");
cl.close();
arrowfile.delete();
jarfile.delete();
return vehiclearrowclass;
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath
(
new ClassClassPath(Bukkit.class)
);
CtClass cc = pool.makeClass("com.cnaude.chairs.VehicleArrow");
cc.setSuperclass(pool.getCtClass(arrowclass));
cc.setInterfaces
(
new CtClass[]
{
pool.get(Vehicle.class.getName())
}
);
String counstructorsource = "public VehicleArrow("+craftserver.getName()+" server, "+entityarrow.getName()+" entity)\n{\nsuper(server, entity);\n}";
cc.addConstructor
(
CtNewConstructor.make(counstructorsource, cc)
);
return cc.toClass();
}