[Java Question] Использование темп файлов как классы

435
1
Такой вопрос - можно ли после создания темп файла использовать его как класс?
 

CumingSoon

Местный стендапер
1,634
12
269
Всмысле? Записывать будет можно, тот же файл обычный(почти)
 
435
1
Допустим есть временный файл. Нужно его превратить в класс, с которым будет работать программа. (Создание новых классов во время работы программы).
 

CumingSoon

Местный стендапер
1,634
12
269
Как вариант скомпилировать его через джаву. Еще можно скрипт туда написать
 
808
3
124
Ну, компиляция джава-кода - тот ещё гемор, а вот подгрузить динамически созданный класс - почему бы и нет?Просто загружаешь из массива байтов байткод.
ClassLoader#defineClass
 
435
1
GloomyFolken написал(а):
Ну, компиляция джава-кода - тот ещё гемор, а вот подгрузить динамически созданный класс - почему бы и нет?Просто загружаешь из массива байтов байткод.
ClassLoader#defineClass
Ну собственно можно поточнее? В плане получения массива байтов из файла с исходным кодом.

Нашел пример. Сейчас попробую.
 
808
3
124
А так ли нужно получать байткод из файла с исходным кодом? ИМХО генерировать и модифицировать байткод намного удобнее, чем java-код. Вообще если нужно компилировать в рантайме, то можно заюзать Javassist, но ИМХО это сомнительное удовольствие.
 
435
1
В общем гружу класс, получаю вот такое:
Код:
cpw.mods.fml.common.LoaderException: java.lang.ClassFormatError: Incompatible magic value 1885430635 in class file TestClass
 
643
6
14
MrCreppo написал(а):
В общем гружу класс, получаю вот такое:
Код:
cpw.mods.fml.common.LoaderException: java.lang.ClassFormatError: Incompatible magic value 1885430635 in class file TestClass
Магическое число 1885430635 в классе-файле TestClass
 
435
1
там нет такого числа )
[merge_posts_bbcode]Добавлено: 25.10.2015 23:11:49[/merge_posts_bbcode]

Имеется такой класс:
Код:
package assets.buildbox;

import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class TestClass extends CreativeTabs {

    public TestClass(int position, String tabID) {
        super(position, tabID);
    }

    @SideOnly(Side.CLIENT)
    public int getTabIconItemIndex() {
            return Block.blockEmerald.blockID;
    }

    public String getTranslatedTabLabel() {
        return "TestLabel";
    }
}

Превращаю его в массив байтов с помощью этого(метод findClass - делает класс из массива)

Код:
package ru.modloader;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class NetworkClassLoader extends ClassLoader {

    public Class findClass(String path, String name) {
        byte[] b;
        try {
            b = readContent(path, name);
            
            return defineClass(name, b, 0, b.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public byte[] readContent(String path, String name) throws IOException{
        ByteArrayOutputStream out = null;
        InputStream input = null;
        try{
            out = new ByteArrayOutputStream();
            input = new BufferedInputStream(new FileInputStream(path));
            int data = 0;
            while ((data = input.read()) != -1){
              out.write(data);
            }
        }
        finally{
           if (null != input){
               input.close();
           }
           if (null != out){
               out.close();
           }
        }
        return out.toByteArray();
    }
    
}
Что я делаю не так?
 
808
3
124
Эээ, а где ты его компилируешь-то? Грузи или скомпилированный/сгенерированный .class файл, или потрудись его в загрузчике компилить (через Javassist, например).
P.S: ты там бекдор делаешь, что ли?
 
435
1
Нет, не бекдор. Хранение классов мода на сервере и их передача на клиент.
 

CumingSoon

Местный стендапер
1,634
12
269
Отправить класс, который вырубит сервер :devil:
 
1,990
18
105
>Использует смайл
kiss_1kb.1445886674.png

>Утверждает, что он не равен
 
Сверху