<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Apache的BCEL庫,文檔很少,例子也很簡(jiǎn)單。動(dòng)態(tài)構(gòu)建類的工作,要求的只是并不是熟練使用BCEL類庫本身,而是要對(duì)java的class結(jié)構(gòu)了解。我對(duì)java的pcode也不熟悉,但是我曾經(jīng)做過大量的.NET的反編譯工作,兩者類似,所以我用BCEL也不覺得困難。

    我提供一個(gè)例子,這里例子是使用BCEL創(chuàng)建類的實(shí)例,而不是使用反射。

    如下:

    IFactory.java

    public interface IFactory {
        
    public Object newInstance();    
    }

    FileClassLoader.java
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;

    public class FileClassLoader extends ClassLoader {
        
    public FileClassLoader() {
            super();
        }


        
    public FileClassLoader(ClassLoader parent) {
            super(parent);
        }


        
    public Class getClass(String className, String filePath) {
            FileInputStream fileInputStream 
    = null;
            
    byte[] data = null;
            
    try {
                fileInputStream 
    = new FileInputStream(new File(filePath));

                ByteArrayOutputStream byteArrayOutputStream 
    = new ByteArrayOutputStream();
                
    int ch = 0;
                
    while ((ch = fileInputStream.read()) != -1{
                    byteArrayOutputStream.write(ch);
                }

                data 
    = byteArrayOutputStream.toByteArray();
                
    return defineClass(className, data, 0, data.length);
            }
     catch (IOException e) {
                e.printStackTrace();
                
    throw new Error(e.getMessage(), e);
            }

        }

    }

    buildFactory方法:
    public static IFactory buildFactory(String procductClassName)
            throws Exception 
    {
        InstructionList il 
    = new InstructionList();
        String className 
    = "HelloWorld";
        ClassGen class_gen 
    = new ClassGen(className, "java.lang.Object",
                
    "", Constants.ACC_PUBLIC | Constants.ACC_SUPER, null);
        ConstantPoolGen cons_pool 
    = class_gen.getConstantPool();
        class_gen.addInterface(IFactory.
    class.getName());

        InstructionFactory il_factory 
    = new InstructionFactory(class_gen);

        
    // 創(chuàng)建構(gòu)造函數(shù)
        {
            String methodName 
    = "";

            Type returnType 
    = Type.VOID;
            Type[] arg_Types 
    = new Type[] {};
            String[] arg_names 
    = new String[] {};
            MethodGen method_gen 
    = new MethodGen(Constants.ACC_PUBLIC,
                    returnType, arg_Types, arg_names, methodName, className,
                    il, cons_pool);

            
    // super();
            il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
            il.append(il_factory.createInvoke(
    "java.lang.Object""",
                    Type.VOID, 
    new Type[0], Constants.INVOKESPECIAL));
            il.append(InstructionFactory.createReturn(Type.VOID));

            method_gen.setMaxStack();
            class_gen.addMethod(method_gen.getMethod());
            il.dispose(); 
    // Reuse instruction handles of list
        }


        
    {
            String methodName 
    = "newInstance";
            Type returnType 
    = Type.OBJECT;
            Type[] arg_Types 
    = new Type[] {};
            String[] arg_names 
    = new String[] {};
            MethodGen method_gen 
    = new MethodGen(Constants.ACC_PUBLIC,
                    returnType, arg_Types, arg_names, methodName, className,
                    il, cons_pool);
            il.append(il_factory.createNew(procductClassName));
            il.append(InstructionConstants.DUP);
            il.append(il_factory.createInvoke(procductClassName, 
    "",
                    Type.VOID, 
    new Type[0], Constants.INVOKESPECIAL));
            il.append(InstructionFactory.createReturn(Type.OBJECT));
            method_gen.setMaxStack();

            class_gen.addMethod(method_gen.getMethod());
            il.dispose(); 
    // Reuse instruction handles of list
        }


        
    // 保存到文件中
        JavaClass clazz = class_gen.getJavaClass();
        String path 
    = "e:\\temp\\" + className + ".class";
        class_gen.getJavaClass().dump(path);

        
    // 使用ClassLoader裝載class
        FileClassLoader classLoader = new FileClassLoader();
        Class factoryClass 
    = classLoader.getClass(className, path);
        Object newInst 
    = factoryClass.newInstance();

        
    return (IFactory) newInst;
    }

    測(cè)試用例:
    String className = "java.lang.Object";
    IFactory factory 
    = buildFactory(className);
    Object inst 
    = factory.newInstance();
    posted on 2005-04-14 23:59 溫少的日志 閱讀(8647) 評(píng)論(7)  編輯  收藏
    Comments

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 国产免费AV片在线播放唯爱网| 大学生a级毛片免费观看| 亚洲嫩草影院在线观看| 色婷婷7777免费视频在线观看 | 亚洲一区二区三区不卡在线播放| 成人激情免费视频| 亚洲天堂免费在线视频| 亚洲a级在线观看| 久久影视综合亚洲| 欧亚精品一区三区免费| 伊人久久大香线蕉免费视频| 亚洲AV无码专区国产乱码不卡| 国产亚洲一区二区三区在线| 午夜dj免费在线观看| 日韩人妻无码精品久久免费一| 婷婷亚洲综合五月天小说在线 | 免费又黄又爽又猛大片午夜| 337p日本欧洲亚洲大胆艺术| 亚洲AV无码乱码在线观看牲色| 69式互添免费视频| a视频在线免费观看| 亚洲av无码片vr一区二区三区| 亚洲视频免费在线观看| 亚洲无码高清在线观看| 最近中文字幕mv免费高清电影| 香蕉免费一区二区三区| 免费人成动漫在线播放r18| 亚洲一级毛片免观看| 久久亚洲精品成人| 亚洲人成无码网WWW| 日本免费网站在线观看| 国产片AV片永久免费观看 | 免费久久精品国产片香蕉| 国产成人福利免费视频| 国产情侣久久久久aⅴ免费 | 成全视频免费高清| 免费观看无遮挡www的小视频| 黄色网址在线免费| aa毛片免费全部播放完整| 国产亚洲精品免费| 日韩国产欧美亚洲v片 |