2016-03-23 6 views
1

こんにちは、StackoverflowコミュニティJava Bukkitは、InputStreamから.jarファイルをロードします。

私はJavaとbukkitに固有の質問があります。私は暗号化されたプラグインを持っていると私はディスク上に復号化されたファイルを保存したくない。だから私はInputStreamを使用しました。しかし、今私の問題は、このファイルをminecraft(bukkit)に注入する方法です。 カスタムクラスローダーはありますか?私はたくさんの検索をしましたが、実際の解決方法は見つけられません。

私は、AES-128で暗号化されたプラグインを解読:

FileInputStream fin; 
    CipherInputStream cin; 
    int nread = 0; 
    byte [] inbuf = new byte [MAX_FILE_BUF]; 

    fin = new FileInputStream (input); 
    cin = new CipherInputStream (fin, mDecipher); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    while ((nread = cin.read (inbuf)) > 0) 
    { 
     byte[] trimbuf = new byte [nread]; 
     for (int i = 0; i < nread; i++) 
     { 
      trimbuf[i] = inbuf[i]; 
     } 
     baos.write(trimbuf); 
    } 

だから今、私はこれは、この時点ではうまく機能しているのInputStream

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    InputStream is2 = new ByteArrayInputStream(baos.toByteArray()); 
    JarInputStream in = new JarInputStream(is2); 

でファイルをロードしようとしました。今、私はbukkitサーバーにこのInputStream "is2"をロードします。

答えて

0

Javaでウェイクラスのロードが機能するので、入力ストリームからクラスを直接ロードすることはできません。あなたは何ができるか、である:

  • ロード
  • は、そのクラスローダを使用してメモリ
  • からファイルをロードするカスタムクラスローダを使用したメモリへのjarからすべてのファイルは、あなたのプラグインをロードするために

最初の手順は簡単ですが、jarファイルのファイルにはMap<String,byte[]>を作成します。

Map<String,byte[]> map = new HashMap<>(); 
ZipEntry entry; 
byte[] read = new byte[1024]; 
while((entry = in.getNextEntry()) != null) { 
    ByteArrayOutputStream r = new ByteArrayOutputStream(Math.max(128, entry.getSize())); 
    int i; 
    while((i = in.read(read) >= 0) 
     r.write(read, 0, i); 
    is.close(); 
    map.put(entry.getName(), r.toByteArray()); 
} 

ファイル名の私たちのマップを持つこと - >データのバイト配列、我々はその後、私たちのカスタムクラスローダを実装することができますので、bukkitでestrictionsの

public class MappedJarClassLoader extends ClassLoader { 
    Map<String,byte[]> map = new HashMap<>(); 

    public MappedJarClassLoader (ClassLoader parent, Map<String,byte[]> map) { 
     super(parent); 
     this.map = map; 
    } 

    public Class findClass(String name) throws ClassNotFoundException { 
     byte[] b = map.get(name.replace('/', '$').replace('.', File.separatorChar)); 
     if(b == null) 
      throw new ClassNotFoundException(name); 
     return defineClass(name, b, 0, b.length); 
    } 
} 

を、我々は内部JavaPluginを拡張するクラスを配置することはできませんjarファイルの暗号化された部分。これを行う代わりに、メインインスタンスを受け入れるコンストラクタを持つ暗号化されたjarファイル内にクラスを配置し、onEnableにクラスをロードします。

mappedJarClassLoader.loadClass("path.to.new.class").getConstructor(getClass()).newInstance(this) 
関連する問題