2011-03-30 19 views
7

के दौरान नई जावा क्लास फ़ाइलों को लिखना और कार्यान्वित करना क्या किसी भी तरह से चल रहे प्रोग्राम में किसी नए जावा क्लास को 'आयात' करना संभव है और इसका उपयोग करना संभव है?रन-टाइम

क्या मेरे पास कोई प्रोग्राम '.java' प्रकार की एक नई फ़ाइल बना सकता है और फिर इसे प्रोजेक्ट फ़ाइलों में शामिल कर सकता है और प्रोग्राम को पुनरारंभ किए बिना इसका संदर्भ देता है?

import java.io.*; 

public class Program { 

File JClass = new File("JClass.java"); 
public static BufferedWriter out = null; 

    public static void main(String[] args) { 
     try { 
      out = new BufferedWriter(new FileWriter("JClass.java")); 
      out.write("public abstract class JClass {"); 
      out.newLine(); 
      out.newLine(); 
      out.write(" public void printSomething(String a) {"); 
      out.newLine(); 
      out.write("  System.out.println(a);"); 
      out.newLine(); 
      out.write(" }"); 
      out.newLine(); 
      out.write("}"); 
      out.close(); 
     } catch (IOException e) 
     { 
      System.exit(-1); 
     } 

     //Somehow import JClass.java as a class here 

     JClass.printSomething("Yay! It worked!"); 
    } 

} 

परिणामस्वरूप 'JClass.java' फ़ाइल:

public abstract class JClass { 

    public void printSomething(String a) { 
     System.out.println(a); 
    } 
} 

इसी तरह, यह में से एक की प्रतिलिपि बनाने के लिए संभव होगा

निम्नलिखित मैं क्या मतलब का एक उदाहरण है प्रोजेक्ट की स्रोत फाइलें, फ़ाइल में कोड संपादित करें, और फिर किसी भी तरह से चल रहे प्रोग्राम पर बदलावों को मजबूर करें?

मुझे इस बिंदु पर व्यावहारिक अनुप्रयोग के बारे में बहुत कुछ परवाह नहीं है। मैं केवल प्रोग्रामिंग से संबंधित विभिन्न विचारों की खोज कर रहा हूं। मैं यह भी समझता हूं कि यह आपदा के सभी प्रकार के लिए संभावित है। चलने वाले कोड को संपादित करना, और फ्लाई पर कक्षाओं सहित (जो मुझे कल्पना नहीं है, त्रुटियों के लिए जांच की जाएगी क्योंकि अन्य वर्गों को प्रोजेक्ट बनाया गया है), बहुत अप्रत्याशित परिणाम हो सकते हैं। मैं केवल विचार के साथ खेलना चाहता हूं।

उस ने कहा, अगर किसी के पास कोई मदद करने वाली चेतावनियां हैं या चीजों को देखने के लिए, तो मैं उनकी सराहना करता हूं। अन्यथा, अगर लोग जवाब देने से रोकते हैं तो मैं सराहना करता हूं 'यह एक बुरा विचार है' या 'समस्याओं को हल करने के लिए आसान और बेहतर तरीके हैं'। मैं इसके साथ किसी समस्या को हल करने की कोशिश नहीं कर रहा हूं। मैं केवल विचार की तलाश कर रहा हूं।

तो, क्या यह संभव है?

उत्तर

5

जावस्सिस्ट आपको मौजूदा कक्षाओं को संशोधित करने और रन टाइम पर नई कक्षाएं बनाने देगा। http://www.csg.is.titech.ac.jp/~chiba/javassist/

जावसिस्ट tutorial में एक नई कक्षा को खरोंच से परिभाषित करने के लिए एक अनुभाग है। नई विधियों को जोड़ने के तरीके को देखने के लिए API देखें। जावासिस्ट एपीआई में CtNewMethod.make देखें।

जावसिस्ट जेबॉस द्वारा पहलू उन्मुख प्रोग्रामिंग को लागू करने के लिए उपयोग किया जाता है।

आप EATS (उपकरण विधि ब्याज की) भी देख सकते हैं जो जावासिस्ट का उपयोग रनटाइम पर मौजूदा विधियों में नया कोड जोड़ने के लिए करता है। खातियां रिलीज संस्करण पर नहीं है, लेकिन यह काम करता है: o

JPDA कक्षाओं को संशोधित करने के लिए कुछ तंत्र प्रदान करता है जो पहले ही लोड हो चुके हैं और JVM में चल रहे हैं।

+0

एएसएम और सीजीएलआईबी समान पुस्तकालय हैं। इस दृष्टिकोण का व्यापक रूप से उपयोग किया जाता है और शायद फ्लाई पर कोड बनाने का "सबसे अच्छा" तरीका है। – erickson

+0

ई, ईएटीएस हंगेरियन नोटेशन का उपयोग करता है। :-( – corsiKa

2

आप classloader

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html

वहाँ भी तंत्र आप कक्षाएं संकलित करने के लिए उपयोग कर सकते हैं के साथ उड़ वर्ग लोड हो रहा है पर ध्यान देना चाहिए, लेकिन वह शायद नहीं के रूप में आप के लिए उपयोगी हो जा रहा है।

0

आप वास्तव में एक संकलक चाहते हैं - java.lang.Compiler को देखो:

http://download.oracle.com/javase/6/docs/api/java/lang/Compiler.html

आप एक नया .class फ़ाइल संकलन के द्वारा एक अलग वर्ग इस तरह से लोड कर सकते हैं।

यह आपको एक लोड कक्षा को बदलने नहीं देता है। ऐसा करने के लिए आपको java.lang.instrument.ClassFileTransformer की भी आवश्यकता है और जिसे रनटाइम पर कमांड लाइन पर निर्दिष्ट किया जाना है। एक फ़ाइल से जावा इसे कहीं और संकलित एक के रूप में एक ही चेकों के माध्यम से जाना होगा संकलित किया गया है, तो

  • :

    अपने अन्य प्रश्नों का उत्तर देने के लिए।

  • यदि आप उपयुक्त उपकरण (उदाहरण के लिए बीसीईएल या एएसएम) का उपयोग करके बाइट कोड बनाते हैं तो यह अभी भी आंतरिक रूप से संगत साबित करने के लिए कई चेक के माध्यम से जाता है।
  • यदि आप एक चल रहे वर्ग बदलते हैं, तो आप जो भी बदल सकते हैं उसमें सीमित हैं।
0

वहां एक और को फेंकना: Eclipse Java Compiler। बीसीईएल, एएसएम, या जैस्मीन के विपरीत, आपको असेंबली को जानने की आवश्यकता नहीं है। ईसीजे जावा में लिखा गया एक जावा कंपाइलर है।