2015-06-16 4 views
8

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

उदाहरण

Class<?> dynamicType = new ByteBuddy() 
     .subclass(MyAbstractClass.class) 
     .method(named("mymethod")) 
     .intercept(new MyImplementation(args)) 
     .make() 
     .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
     .getLoaded(); 

जहां MyImplementation चेन कई StackManipulation एक साथ आदेशों गतिशील रूप से उत्पन्न कोड बनाने के लिए के लिए

क्या मैं जेनरेटेड क्लास को फ़ाइल में लिख सकता हूं, (इसलिए मैं मैन्युअल रूप से आईडीई का निरीक्षण कर सकता हूं), या अन्यथा जेनरेट क्लास के लिए बाइटकोड प्रिंट कर सकता हूं?

+0

जैसा कि बताया गया है, आप फ़ाइल को क्लास फ़ाइल के रूप में स्टोर कर सकते हैं और * javap * का उपयोग करके इसका निरीक्षण कर सकते हैं। –

उत्तर

11

आप .class फ़ाइल के रूप में वर्ग बचा सकते हैं:

new ByteBuddy() 
    .subclass(Object.class) 
    .name("Foo") 
    .make() 
    .saveIn(new File("c:/temp")); 

इस कोड c:/temp/Foo.class पैदा करता है।

2

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

import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.file.StandardOpenOption; 
import net.bytebuddy.ByteBuddy; 
import net.bytebuddy.instrumentation.FixedValue; 
import static net.bytebuddy.instrumentation.method.matcher.MethodMatchers.named; 

public class GenerateClass extends ClassLoader { 

    void doStuff() throws Exception { 
     byte[] classBytes = new ByteBuddy() 
       .subclass(Object.class) 
       .name("MyClass") 
       .method(named("toString")) 
       .intercept(FixedValue.value("Hello World!")) 
       .make() 
       .getBytes(); 

     // store the MyClass.class file on the file system 
     Files.write(Paths.get("MyClass.class"), classBytes, StandardOpenOption.CREATE); 

     // create an instance of the class from the byte array 
     Class<?> defineClass = defineClass("MyClass", classBytes, 0, classBytes.length); 
     System.out.println(defineClass.newInstance()); 
    } 

    public static void main(String[] args) throws Exception { 
     new GenerateClass().doStuff(); 
    } 
} 
+0

धन्यवाद सबोपेटिमल। मैंने saka1029 के जवाब को स्वीकार किया, क्योंकि यह छोटा था और एक ही चीज़ हासिल की। – bramp

+0

@bramp यह ठीक है। क्योंकि उत्तर अलग-अलग चीजों को हल कर रहे हैं। Saka1029 का उत्तर कक्षा उत्पन्न करता है और इसे एक फ़ाइल में सहेजता है। मेरा उत्तर कक्षा उत्पन्न करता है, इसे फ़ाइल में सहेजता है और आप जेनरेट क्लास को तुरंत चालू कर सकते हैं। यदि आपको जेनरेटेड क्लास को तुरंत चालू करने की आवश्यकता नहीं है या जेनरेट बाइट्स तक पहुंच की आवश्यकता नहीं है, तो saka1029 का जवाब जाने का तरीका है। – SubOptimal

संबंधित मुद्दे