2 Haziran 2009 Salı

Java Sınıflarını Calisma Zamanında Derleme ve Yükleme (Compile and Load Java Classes at Runtime)




Bilinen Hatalar: Sınıfı birkez derleyip çalıştırdıktan sonra tekrar değişiklik yapar ve tekrar çalıştırmak isterseniz, önceki hali ile çalışıyor. Uygulamayı kapatıp tekrar açar ve çalıştır derseniz, düzgün çalışıyor. Hatta tekrar açtığınızda çalıştırmadan önce değişiklik yapar ve tekrar derlerseniz, yeni hali ile çalıştırabilirsiniz. Bunun nedeni sanırım çalışma zamanı yüklenen sınıfın tekrar kaldırma (unload) işlemini yapamaması.

Eğer bu konuda gerekli düzeltmeyi yapan olursa, ben de sevinirim.



Çalıştırmak İçin: Derle butonuna tıkladığınızda, uygulama dizininde "test" adında bir dizin yoksa oluşacak ve ".java" ve ".class" dosyaları burada oluşacaktır. Çalıştırmak istediğinizde uygulamanın oluşan ".class" dosyasını bulabilmesi için "test" dizininin classpath'e eklenmiş olması gerekmektedir. Aşağıdaki kodu kullanabilirsiniz.

      java -classpath classes:test test.derleveyukle.DerleVeYukleSinif


package test.derleveyukle;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


public class DerleVeYukleSinif {
private JFrame frame;
private BorderLayout layout;
private JPanel topPanel;
private JButton jbtnYeni;
private JButton jbtnDerle;
private JButton jbtnCalistir;
private JButton jbtnCikis;
private JEditorPane editorPane;

private static final String DEFAULT_TEXT = "public class TestClass{\n" +
" public TestClass(){\n" +
" //\n" +
" }\n" +
"}";

private File path;
private String SOURCE_FILE_NAME;
private static final String CLASS_NAME = "TestClass";

public DerleVeYukleSinif() {
path = new File("test");

SOURCE_FILE_NAME = path.getAbsolutePath()+
File.separator+
"TestClass.java";

frame = new JFrame("Calisma Zamani Sinif Derleme ve Yukleme Ornegi");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);

layout = new BorderLayout();
frame.setLayout(layout);

topPanel = new JPanel();

jbtnYeni = new JButton("Yeni");
jbtnYeni.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnYeni(e);
}
});

jbtnDerle = new JButton("Derle");
jbtnDerle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnDerle(e);
}
});

jbtnCalistir = new JButton("Calistir");
jbtnCalistir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnCalistir(e);
}
});

jbtnCikis = new JButton("Cikis");
jbtnCikis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnCikis(e);
}
});

topPanel.add(jbtnYeni);
topPanel.add(jbtnDerle);
topPanel.add(jbtnCalistir);
topPanel.add(jbtnCikis);

editorPane = new JEditorPane();
if (!oncekiKod())
OnYeni(null);

frame.getContentPane().add(topPanel, BorderLayout.NORTH);
frame.getContentPane().add(new JScrollPane(editorPane),
BorderLayout.CENTER);

path.mkdirs();

frame.setVisible(true);
}

private void OnYeni(ActionEvent e) {
editorPane.setText(DEFAULT_TEXT);
editorPane.requestFocus();
}

private void OnDerle(ActionEvent e) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
FileOutputStream fos;
try {
fos =
new FileOutputStream(new File(SOURCE_FILE_NAME));

fos.write(editorPane.getText().toString().getBytes());

int compilationResult =
compiler.run(null, null, null, SOURCE_FILE_NAME);
if (compilationResult == 0) {
System.out.println("Derleme islemi basarili.");
} else
System.err.println("Derleme islemi basarisiz!");
} catch (FileNotFoundException f) {
System.err.println("FileNotFoundException: " + f.getMessage());
} catch (IOException f) {
System.err.println("IOException: " + f.getMessage());
}
}

private void OnCalistir(ActionEvent e) {
try {
URL url = new URL("file://" + path.getAbsolutePath());
URL[] urls = new URL[] { url };

ClassLoader loader = URLClassLoader.newInstance(urls);

Class testClass = loader.loadClass("TestClass");
testClass.newInstance();
} catch (MalformedURLException f) {
System.err.println("MalformedURLException: " + f.getMessage());
} catch (ClassNotFoundException f) {
System.err.println("ClassNotFoundException: " + f.getMessage());
} catch (InstantiationException f) {
System.err.println("InstantiationException: " + f.getMessage());
} catch (IllegalAccessException f) {
System.err.println("IllegalAccessException: " + f.getMessage());
}
}

private void OnCikis(ActionEvent e) {
frame.dispose();
}

private boolean oncekiKod() {
File file =
new File(SOURCE_FILE_NAME);
int ch;
StringBuffer kod = new StringBuffer("");
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
while ((ch = fin.read()) != -1)
kod.append((char)ch);
fin.close();
} catch (FileNotFoundException e) {
return false;
} catch (IOException ioe) {
return false;
}

editorPane.setText(kod.toString());

return true;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DerleVeYukleSinif();
}
});
}
}


1 yorum:

  1. Elinize saglık bence cok faydalı olmus.Son sürat paylaşmaya devam...

    YanıtlaSil