知识大全 在运行时刻从文件中调入Class

Posted 文件

篇首语:学习并不等于就是摹仿某些东西,而是掌握技巧和方法。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在运行时刻从文件中调入Class相关的知识,希望对你有一定的参考价值。

在运行时刻从文件中调入Class  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  前言     了解JAVA的类装载器         Java 编程语言编译器把源代码代码转换成为一个假定机器(即虚拟机)上的 机器语言 虚拟机代码保存在一个后缀为 class的类文件中 每个类文件保存这 个类的所有方法的虚拟机代码         当运行时用一个解释程序解释这些类文件 把这些文件内的虚拟机指信信令翻 译成本地的机器语言 分存内存 确定程序入口点         类装载器功能类似与C中调入dll文件文法 在C中是调入dll文件分配内存 确定 程序入口点(分配入口指针) 而在java中调入一个class文件 同样是从本地或网络 中调入文件 转换为本地机器代码 分配内存 确定程序入口点         当我们在使用中有时要使用一个新类 知道它的文件路径和它的文件名字 我们 要把它调入系统并使用它或者说一个类文件已经被加密处理 类文件里面的内容 是我们加密后的密文 不能直接使用 只能是对文件内容解密后才能使用 就可 以用类库加载器ClassLoader 把类文件当做数据流读入到一个byte[]中 对 这个 byte[]进行解密处理后(没加密当然就不用做这步了) 再通过 byte[] 生成一个类 并加载到系统中         对于使用中有以下两种方法         方法     使用接口类 新调用的class是对它的具体实现      ) 写一个接口类 newface class     public interface newface     public void out(String xx);    public int outsize(String x String x );                         ) 写接口文件实现 testfacea class 并更名为 testfacea file 或其它文件名全可以     /*    newface的实现    */    public class testfacea implements newface    public void out(String xx)     System out println(xx+ for testfacea );        public int outsize(String x String x )     return x length()+x length();;                执行的的命令    javac testfacea java    ren testfacea class testfacea file         ) 在主程序中调入文件到byte[]中 可以在文件可以在本地 也可用网络无论如何只要能将编译后的文件内容的类代码放到 byte[]当中就可以        java io FileInputStream in=new java io FileInputStream(namefile);        byte[] classbyte=new byte[maxsize];         ) 转换成一个Class并初始化        return defineClass(classname classbyte readsize);         ) 实现接口    实际上就是对一个接口类用调入的文件实现 当然可以用不同的文件进行不同的实现也可以对一个文件进行加解密操作     //方法 的例子代码 newface是本地接口类 newface class本地已经存在 开始    testc=cl load( testfacea file testfacea );    testo=testc newInstance();    ((newface)testo) out( 方法 第( )种使用方法 );    System out println( outsize= +((newface)testo) outsize( aaaa ));    或        testc=cl load( testfacea fisle testfacea );    testo=testc newInstance();    newface newface =(newface)testo;    newface out( 方法 第( )种使用方法 );    System out println( outsize= +newface outsize( bbbbb ));                    要注意的是对一个要调入的文件 一定要是一个已经存在的接口类的实现这个有点EJB中的调用的中远程接口要在本地 而调入的文件就是EJBobject了这种方法的的好处是要调入的class中的方法是可以说是已知的 相对来讲这种方法简明易用以下是主程序的完整代码     //使用的主程序    public class testnewface     public static void main(String[] args) throws java lang Exception        // 共用初使化参数 开始    Class testc;    Object testo;    cloader cl=new cloader();    // 共用初使化参数 结束        //方法 的例子代码 newface是本地接口类 newface class本地已经存在 开始    testc=cl load( testfacea file testfacea );    testo=testc newInstance();         ((newface)testo) out( 方法 第( )种使用方法 );    System out println( outsize= +((newface)testo) outsize( aaaa ));         testc=cl load( testfacea fisle testfacea );    testo=testc newInstance();    newface newface =(newface)testo;    newface out( 方法 第( )种使用方法 );    System out println( outsize= +newface outsize( bbbbb ));    //方法 的例子代码 结束            /*    要想自己完成从一个 byte[] 转换到一个Class 必须要 extends ClassLoader    因为ClassLoader中的方法defineClass是 protected 要使用只有 extends ClassLoader    */    class cloader extends ClassLoader     static int maxsize= ;    public Class load(String namefile String classname) throws java lang Exception        try     //进行判断这个class是否已经调入 已经有就直接返回 不然就调入    Class ctmp=this findLoadedClass(classname);    System out println(ctmp getName()+ is load );    return ctmp;        catch (Exception e)     //System out println(e);        java io FileInputStream in=new java io FileInputStream(namefile);    byte[] classbyte=new byte[maxsize];    //实际应用时完全可以对一个文件进行加解密处理 只要保证使用defineClass时classbyte中    //已经解密后的内容就可以    int readsize;    readsize=in read(classbyte);    // System out println( 读文件长: +readsize);    in close();    return defineClass(classname classbyte readsize);                        方法     不使用本地接口类的方法 这种方法class从文件定义成一个class和方法 是相同的 但要使用这个class就不同了 这种方法不需要接口类      ) 写一个类 testfacea class (本例中为了方便还是使用了testfacea 实际上已经可以不用 implements newface 即可以完全不用接口类)     public class testfacea     public void out(String xx)     System out println(xx+ for testfacea );        public int outsize(String x String x )     return x length()+x length();;                        为明析起见还有一个测试用类型 一个列系统信息表的类     public class listinfo     public static void main(String[] args)     //列系统信息表 begin    String skey sinfo;    Object so;    java util Enumeration hlistkey=System getProperties() propertyNames();    while (hlistkey hasMoreElements())        skey=(String)hlistkey nextElement();    so=System getProperty(skey);    System out println( key= +skey+ info= +so);        //列系统信息表 end                         ) 生成 testfacea class 更名为 testfacea file 或其它文件名也可以        生成 listinfo class 更名为 listinfo file 或其它文件名也可以        执行的的命令        javac testfacea java        ren testfacea class testfacea file        javac listinfo java        ren listinfo class listinfo file         ) 主程序中调入文件到byte[]中 可以在本地文件调用 也可用网络无论如何只要能将 cha138/Article/program/Java/JSP/201311/19297

相关参考