2011-10-14 13 views
7

मेरे पास निम्नलिखित अजीब आवश्यकता है।बाइटकोड कैसे उत्पन्न करें और .class फ़ाइल में कैसे सहेजें?

मैं दिया हूँ:

  1. कुछ विधि के नाम की एक सूची।
  2. उपरोक्त तरीकों के पैरामीटर के नाम और प्रकार।
  3. उपरोक्त तरीकों की कार्यक्षमता। यह निम्नानुसार है: प्रत्येक पैरामीटर के लिए, विधि toString का उपयोग करके स्ट्रिंग में परिवर्तित हो जाती है और तारों की एक सरणी प्राप्त करती है। इस सरणी में, विधि foo फ़ंक्शन लागू करती है। फ़ंक्शन fooString [] प्रकार इनपुट के रूप में लेता है और String आउटपुट करता है। विधियों को वापस foo रिटर्न देता है। foo का कोड जावा ऑब्जेक्ट के अंदर दिया गया है और इसे ब्लैक-बॉक्स के रूप में एक्सेस किया जाना है।

जानकारी 1. और 2. में एक पाठ या एक्सएमएल फ़ाइल में हो सकता है। इस उद्देश्य के लिए, हम किसी भी तरह से जावा ऑब्जेक्ट के अंदर उपलब्ध होने पर विचार कर सकते हैं।

कार्य .class फ़ाइल (यानी, बाइटकोड) बनाने के लिए है जो उन विधियों को लागू करता है और JVM पर चलाया जा सकता है।

मुझे लगता है कि this assembler library ऐसा करने का एक तरीका होगा। क्या कोई आसान तरीका सुझा सकता है?

[संपादित करें]] मैं एक और तरीके से सोच सकता हूं: पहले .java फ़ाइल उत्पन्न करें और फिर इसे .class फ़ाइल प्राप्त करने के लिए संकलित करें।

[संदर्भ:] मुझे कई सैकड़ों तरीकों से ऐसा करना है। मैं शॉर्टकट चाहता हूं ताकि मैं मैन्युअल रूप से कोड लिखने के बजाय अपना काम स्वचालित कर सकूं। http://java-source.net/open-source/bytecode-libraries

Javassist पर एक नज़र डालें:

+0

क्या आप अधिक संदर्भ दे सकते हैं, आप क्या हासिल करना चाहते हैं ... एक सामान्य व्यवहार (foo) के लिए विशिष्ट तरीकों को "बनाने" के लिए एकमात्र कारण टाइप सुरक्षा है जो समय संकलित करने में सहायक है ...जेनरेट कोड का उपयोग/कॉल करने के लिए आप कैसे जा रहे हैं? – pgras

+0

मैं जेनरेट कोड नहीं कॉल करूंगा। मैं जो करना चाहता हूं वह किसी के लिए उपयोग करने के लिए एपीआई लाइब्रेरी (जार) बनाना है। कक्षा एक विशिष्ट नाम का होगा, इसलिए वे जान लेंगे कि कौन सी एपीआई कॉल करेगी। – Jus12

+0

ठीक है, मैं सैकड़ों तरीकों से समस्या को देखता हूं, क्या विधियों की सूची अक्सर बदलती है या नहीं? क्या आपके पास उपयोग किए जा रहे इनपुट का उदाहरण हो सकता है? – pgras

उत्तर

7

आप जावा सिंटैक्स में आवश्यक प्रोग्राम कोड जेनरेट कर सकते हैं और इसे कंपाइलर का उपयोग करके कक्षा फ़ाइल में बदल सकते हैं। रन टाइम पर javac को तुरंत चालू करना और स्रोत फ़ाइल के स्थान के बजाय इसे बाइट सरणी पास करना संभव है। अन्य प्रोग्रामर बनाए रखने के लिए शायद यह सबसे आसान है।

यदि आप सीधे बाइट कोड जेनरेट करना चाहते हैं, तो asm लाइब्रेरी का सबसे अधिक उपयोग किया जाता है।

+0

मुझे लगता है कि यह शायद सबसे सुविधाजनक तरीका होगा (उत्पन्न करना '.java' फ़ाइल)। – Jus12

+0

क्या आप इस बारे में कुछ जानकारी दे सकते हैं कि 'javac' के माध्यम से यह कैसे करना है कि मैंने .java फ़ाइल बनाई है? – Jus12

+1

यह 'javax.tools' पैकेज में है। इस आलेख में एक उदाहरण है: http://www.ibm.com/developerworks/java/library/j-jcomp/index.html। मुझे यह स्वीकार करना होगा कि मैंने स्वयं 'javax.tools' एपीआई का उपयोग नहीं किया है। – Barend

5

यहाँ मुक्त स्रोत बाईटकोड पुस्तकालय की एक सूची है।

1

मैं तुम्हें मेरी टिप्पणी का जवाब देखा था, लेकिन यह अभी भी मेरे लिए स्पष्ट नहीं है क्यों तुम सिर्फ यह अब टाइप :)

यदि आप एक typesafe चाहते हैं, तो एक जार में पैक किया जा करने के लिए कोड जनरेट करना चाहते हैं एपीआई एक ही व्यवहार वाले सभी तरीकों से आप एक दिए गए इंटरफ़ेस के लिए गतिशील प्रॉक्सी प्रदान कर सकते हैं (यह आपको इंटरफ़ेस उत्पन्न करने के तरीके के बारे में प्रश्न के साथ छोड़ देता है :)

यहां एक उदाहरण है जहां सभी MyInterface विधि के सभी कॉल इनवॉक विधि द्वारा संभाला जाएगा (केवल परीक्षण करने के लिए इंटरफेस में विधियों को जोड़ें) ...

package test; 

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 

public class Test { 

interface MyInterface { 

    String methodOne(String s); 

    String methodTwo(String s, Integer i); 
} 

static MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
     MyInterface.class.getClassLoader(), 
     new Class[] { MyInterface.class }, new InvocationHandler() { 
      public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable { 
       StringBuilder result = new StringBuilder(); 
       for (Object arg : args) { 
        result.append(arg.toString()); 
       } 
       return result.toString(); 
      } 
     }); 

public static void main(String[] args) { 
    System.out.println(proxy.methodOne("hello"));  
    System.out.println(proxy.methodTwo("world", 5)); 

} 

} 
+0

यदि मैं इतना टाइप कर सकता हूं, तो सवाल पूछने की आवश्यकता नहीं होगी :-)। मैं मुख्य रूप से स्कैला का उपयोग करता हूं क्योंकि मुझे टाइपिंग पसंद नहीं है। – Jus12