Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Использование загенерированного .java Class


Автор: LeonLG 18.6.2007, 11:40
Всем привет... и сразу к вопросу
Мои Quellcode
Код

package replication;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Vector;

public class GenerateBanditClass {

    public static Vector vec = new Vector();

    public static String s;

    public static void main(String[] args) 
    {

        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    new FileInputStream("BanditBonus.txt")));
            while (null != (s = in.readLine())) {
                vec.add(s);
            }
            in.close();
        } catch (FileNotFoundException fex) {
        } catch (Exception ex) {
            System.out.println(ex);
        }

        try {
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream("C:/workspacej2me/GeneratedJavaClass/replication/BanditBonus.java")));
            for (int i = 0; i < vec.size(); i++) {
                s = vec.get(i).toString();
                System.out.println(s);
                out.write(s, 0, s.length());
                out.newLine();
            }
            out.close();
        } catch (IOException ex) {
            System.out.println(ex);
        }

    }
}


В этом классе я зачитываю .txt File и позже генерирую .java File. 
BanditBonus.java создается (когда делаю refresh "F5"). Но то что стоит в BanditBonus.java не выдается у меня на консоле.

Мой .txt File:

package replication;

public class BanditBonus {
    
    public BanditBonus(){
        System.out.println("Generated successful");
    }    

}

Что также и записывается в .java Class ("BanditBonus.java"). Возможно ли вообще в этом случае использовать загенерированный "BanditBonus.java" Class или есть какая то другая альтернатива  smile ? 

Спасибо заранее... smile 

Автор: LeonLG 18.6.2007, 12:24
Как я понял... без создания нового объекта от класса BanditBonus.java, вадачи на консоле не получится  smile  
А объект от класса BanditBonus создать не могу, т.к. класс будет загенерирован после компилирования 

Автор: LSD 18.6.2007, 21:00
Что-то я нифига не понял смысл самой программы, она просто копирует файл из одного места в другое и все. Что вообще ты пытаешься сделать?

Автор: RebornCrusader 19.6.2007, 01:02
У меня такое чувство, что речь идёт о выполнении сгенерированного кода на лету?

Автор: LeonLG 19.6.2007, 10:31
Как "RebornCrusader" сказал
Цитата

речь идёт о выполнении сгенерированного кода на лету

Мне просто надо создать после компилирования новый файл, который я смог бы позже использовать. Класс который я выложил, это у меня просто тестовый. Из которо я позже смогу исходить.
В классе "GenerateBanditClass" я просто копирую содержание .txt файла, и создаю новый класс "BanditBonus.java":

Код


package replication;

public class BanditBonus {
    
    public BanditBonus(){
        System.out.println("Generated successful");
    }    

}


Который мне должен выдать на консоле:
Generated successful

Чего не делает  smile 
Может это можно сделать както по другому?! 

Автор: math64 19.6.2007, 11:59
После того как создан файл .java, нужно запустить компилятор, поместить .class файл в ClassPath и вызвать Class.forName().newInstance().

Автор: LeonLG 19.6.2007, 12:19
Цитата

После того как создан файл .java, нужно запустить компилятор, поместить .class файл в ClassPath и вызвать Class.forName().newInstance()


А без компилирования возможно это сделать?

Т.е. после того как создан файл .java (при стартовом компилировании), я мог бы сразу использовать загенерированныи код (без повторного компилирования).

Автор: Metal_Heart 19.6.2007, 12:28
LeonLG, 
java-файл - это ТЕКСТ!!!
class-файл - уже откомпилированный и исполняемый!!!

Добавлено @ 12:31
перенос текста из файла типа  txt в файл типа java (или какой-нибудь другой) ничего не изменит. Тебе обязательно надо будет откомпилировать твой новый файл, а вобщем пробуй, как советовал math64

Компилировать код "на лету" идея интересная, но вот вопрос, а что если исходник с синтаксической ошибкой? Тебе ведь придется парсить ответ компилятора ...

Автор: LeonLG 19.6.2007, 13:28
"Metal_Heart"... Спасибо за ответ

Думаю решить свою проблему с помощью "ClassLoader"  smile 

Автор: Metal_Heart 19.6.2007, 13:41
LeonLG, только учти, что в данном случае тебе придеться забыть об исходнике, потому как ClassLoader подгружает откомпилированный class-файл

Автор: LSD 19.6.2007, 14:16
Делаешь так:
- берешь файл tools.jar и кладешь его в CLASSPATH твоей программы (
- создаешь файл с исходником
- компилируешь его с помощью класса com.sun.tools.javac.Main, вызываешь у него метод main(), аргументы теже что и у стандартного javac
- создаешь новый ClassLoader и загружаешь с его помощью твой класс
- через рефлексию вызываешь нужные методы

Автор: LeonLG 21.6.2007, 00:12
Цитата

LeonLG, только учти, что в данном случае тебе придеться забыть об исходнике, потому как ClassLoader подгружает откомпилированный class-файл


попробую сделать через "extends", т.е. загенерированный .java класс наследует методы и переменные от исходникa...надюсь что пойдет  smile 

Ещё один вопрос:
Возможно ли мне удалить, по окончании программы, свои загенерированный класс. T.e. чтобы он при каждом компилировании заново генерировался и удалялся?

Автор: Metal_Heart 21.6.2007, 08:51
LeonLG, если ты имеешь доступ к файловой системе и соответствующие права,  то всё в твоих руках

Автор: fixxer 21.6.2007, 10:19
Подозреваю что в этом случае проще всего использовать Script Engine, например BeanShell

Автор: RebornCrusader 22.6.2007, 01:30
Я для себя выбрал Janino. Вообще эта тема поднималась в форуме неоднократно. Имеет смысл, думаю, собрать все решения (хотя бы ссылки и названия, без подробного описания) и выложить в какой-нибудь FAQ.

Автор: LeonLG 23.6.2007, 14:06
Чегото не могу понять.. как мне создать новый Объект вот этого класса 

Код

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Vector;

public class GenerateBanditClass {

    public static Vector vec = new Vector();

    public static String s;

    public static String className = "BanditBonus";

    public static String path = "/";
    
    public GenerateBanditClass() throws Exception{

        try {
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(
                                    "BanditBonus.txt")));
            while (null != (s = in.readLine())) {
                vec.add(s);
            }
            in.close();
        } catch (FileNotFoundException fex) {
        } catch (Exception ex) {
            System.out.println(ex);
        }

        try {
            BufferedWriter out = new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream(
                                    "BanditBonus.java")));
            for (int i = 0; i < vec.size(); i++) {
                s = vec.get(i).toString();
                out.write(s, 0, s.length());
                out.newLine();
            }
            out.close();
        } catch (IOException ex) {
            System.out.println(ex);
        }
        
        
        newGeneratedClass(path, className);
    }

    static Object newGeneratedClass(String path, String className)
            throws Exception {
        URL url = new File(path).toURL();

        URLClassLoader cl = new URLClassLoader(new URL[] { url });

        Class c = cl.loadClass(className);

        return c.newInstance();

    }

}



Main Класс (если делаю вот так то идет..)

Код

public class Test {

    public static void main(String[] args) throws Exception{
        GenerateBanditClass gBC = new GenerateBanditClass();

    }

}



Как вызвать класс "GenerateBanditClass " (в Main классе ) по другому (или изменить класс "GenerateBanditClass" ), так чтобы main класс был без "throws Exception" ? T.е. вот так:

Код

public class Test {

    public static void main(String[] args) {
        GenerateBanditClass gBC = new GenerateBanditClass();

    }

}



Автор: LSD 23.6.2007, 14:10
Цитата(LeonLG @  23.6.2007,  15:06 Найти цитируемый пост)
Как вызвать класс "GenerateBanditClass " (в Main классе ) по другому (или изменить класс "GenerateBanditClass" ), так чтобы main класс был без "throws Exception" ?

Измени конструктор GenerateBanditClass, так чтобы он не выбрасывал исключения.

Автор: LeonLG 23.6.2007, 14:35
Thanks LCD... зделал вот так:
Код




import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Vector;

public class GenerateBanditClass {

    public static Vector vec = new Vector();

    public static String s;

    public static String className = "BanditBonus";

    public static String path = "/";
    
    
    
    public GenerateBanditClass(){

        try {
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(
                                    "BanditBonus.txt")));
            while (null != (s = in.readLine())) {
                vec.add(s);
            }
            in.close();
        } catch (FileNotFoundException fex) {
        } catch (Exception ex) {
            System.out.println(ex);
        }

        try {
            BufferedWriter out = new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream(
                                    "BanditBonus.java")));
            for (int i = 0; i < vec.size(); i++) {
                s = vec.get(i).toString();
                out.write(s, 0, s.length());
                out.newLine();
            }
            out.close();
        } catch (IOException ex) {
            System.out.println(ex);
        }
        
        try{
            newGeneratedClass(path, className);            
        }catch (Exception ex){
            System.out.println(ex);
        }        
    }
    
    static Object newGeneratedClass(String path, String className)
            throws Exception {
        URL url = new File(path).toURL();

        URLClassLoader cl = new URLClassLoader(new URL[] { url });

        Class c = cl.loadClass(className);

        return c.newInstance();

    }

}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)