Generate class using javassist
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user