Advertisement
SforzandoCF

classbuilder

Mar 1st, 2024 (edited)
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.70 KB | None | 0 0
  1. public class JavaCompiler {
  2.     String name;
  3.     ArrayList<?> data = new ArrayList();
  4.     int constantPoolEnd;
  5.    
  6.     public static JavaCompiler getCompiler (String s, Package p) {
  7.         JavaCompiler returnCompiler;
  8.         try {
  9.             new SecurityManager.checkCreateClassLoader();
  10.             returnCompiler = new JavaCompiler(s, p);
  11.         } catch (SecurityException se) {
  12.             returnCompiler = null;
  13.         } finally {
  14.             return returnCompiler;
  15.         }
  16.     }
  17.    
  18.     JavaCompiler (String s, Package p) {
  19.         String packageName = p.getName().replace(".", "/").concat("/").concat(s);
  20.         //Add "magic"
  21.         data.add(0xCAFEBABE);
  22.         //Add the version number, minor number first, then major number
  23.         data.add((short) 0); data.add((short) 61);
  24.         //Add the constant pool
  25.         data.add((short) 4);
  26.         data.add((byte) 7); data.add((short) 1);
  27.         data.add((byte) 1); data.add((short) packageName.length()); data.add(packageName);
  28.         data.add((byte) 7); data.add((short) 3);
  29.         data.add((byte) 1); data.add((short) 16); data.add("java/lang/Object");
  30.         //Mark the end of the constant pool
  31.         constantPoolEnd = 14;
  32.         //Add access flags
  33.         data.add(JavaCompiler.getDefaultAccessFlags.bytes()[0]); data.add(JavaCompiler.getDefaultAccessFlags.bytes()[1]);
  34.         //Add this class and super class
  35.         data.add((short) 0); data.add((short) 2);
  36.         //Add interfaces
  37.         data.add((short) 0);
  38.         //Add fields
  39.         data.add((short) 0);
  40.         //Add methods
  41.         data.add((short) 0);
  42.         //Add attributes
  43.         data.add((short) 0);
  44.         this.name = name;
  45.     }
  46.    
  47.     public void setAccessFlags (AccessFlags af) {
  48.     }
  49.    
  50.     public Class<?> build () {
  51.         ArrayList<byte> classData = new ArrayList();
  52.         for (Object o : data) {
  53.             if (o instanceof byte) {
  54.                 classData.add(o);
  55.             } else if (o instanceof short) {
  56.                 classData.add(java.nio.ByteBuffer.allocate(2).putShort(o).array());
  57.             } else if (o instanceof int) {
  58.                 classData.add(java.nio.ByteBuffer.allocate(4).putInt(o).array());
  59.             } else if (o instanceof long) {
  60.                 classData.add(java.nio.ByteBuffer.allocate(8).putLong(o).array());
  61.             } else if (o instanceof String) {
  62.                 classData.add(java.nio.ByteBuffer.allocate(o.length()).putInt(o).array());
  63.             } else {
  64.                 throw new IllegalStateException("Class object is not a number or string.");
  65.             }
  66.         }
  67.         return ClassLoader.geSystemClassLoader().defineClass(name, classData, 0, classData.length);
  68.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement