知识大全 在运行时刻从文件中调入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

相关参考

知识大全 Class文件详解 (2)

Class文件详解(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  继续分析Class文件的

知识大全 Class文件详解 (1)

Class文件详解(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们都知道Java编译器

知识大全 Eclipse无法自动编译出class文件

Eclipse无法自动编译出class文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有时候

知识大全 php简单缩略图类image.class.php

  使用方法  $img=newiamge;$img>resize(dstimgjpgsrcimgjpg);说明这个是按照比例缩放dstimgjpg是目标文件srcimgjpg是源文件后面的是目

知识大全 内部类标识符

  由于每个类都会生成一个class文件用于容纳与如何创建这个类型的对象有关的所有信息(这种信息产生了一个名为Class对象的元类)所以大家或许会猜到内部类也必须生成相应的class文件用来容纳与它们

知识大全 eclipse忽略svn目录文件编译

  使用eclipse进行开发时在编译JAVA代码时的原则是对于源代码目录中的所有*java文件编译成同名的*class文件而对于如abcjava中的内部类C编译成abc$Cclass对于所有非jav

知识大全 三星手机强制停止和禁用是什么意思

三星手机强制停止和禁用是什么意思强制禁止:就是应用程序已经调入手机内存处于运行状态了,这时如果无法通过正常途径中止该应用程序运行,则可以通过强制停止的方式停止该应用程序运行,并从手机内存中清除其运行数

知识大全 在Tomcat中运行JSP文件

在Tomcat中运行JSP文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有些网友不知道怎么

知识大全 java中public class与class的区别详解

以下是对java中publicclass与class的区别进行了分析介绍需要的朋友可以过来参考下   在编写类的时候可以使用两种方式定义类publicclass定义类:class定义类:如果

知识大全 编程中如何选择Class, Abstract Class and&n

编程中如何选择Class,AbstractClassand&n  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来