麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

在運行時刻從文件中調入Class

2019-11-18 13:25:33
字體:
來源:轉載
供稿:網友

  前言:
  
  了解java的類裝載器:
  
  
  
  Java 編程語言編譯器把源代碼代碼轉換成為一個假定機器(即虛擬機)上的 機器語言。虛擬機代碼保存在一個后綴為.class的類文件中。每個類文件保存這 個類的所有方法的虛擬機代碼。
  
  
  
  當運行時用一個解釋程序解釋這些類文件,把這些文件內的虛擬機指信信令翻 譯成本地的機器語言,分存內存,確定程序入口點。
  
  
  
  類裝載器功能類似與C中調入dll文件文法,在C中是調入dll文件分配內存,確定 程序入口點(分配入口指針),而在java中調入一個class文件,同樣是從本地或網絡 中調入文件,轉換為本地機器代碼,分配內存,確定程序入口點。
  
  
  
  當我們在使用中有時要使用一個新類,知道它的文件路徑和它的文件名字,我們 要把它調入系統并使用它或者說一個類文件已經被加密處理,類文件里面的內容 是我們加密后的密文,不能直接使用,只能是對文件內容解密后才能使用,就可 以用類庫加載器ClassLoader,把類文件當做數據流讀入到一個byte[]中,對 這個 byte[]進行解密處理后(沒加密當然就不用做這步了),再通過 byte[] 生成一個類,并加載到系統中。
  
  
  
  對于使用中有以下兩種方法:
  
  
  
  方法1
  
  使用接口類,新調用的class是對它的具體實現
  
  1) 寫一個接口類 newface.class
  
  public interface newface {
  
  public void out(String xx);
  
  public int outsize(String x1,String x2);
  
  }
  
  
  
  
  
  
  
  
  
  2) 寫接口文件實現 testfacea.class 并更名為 testfacea.file 或其它文件名全可以
  
  /*
  
  newface的實現
  
  */
  
  public class testfacea implements newface{
  
  public void out(String xx) {
  
  System.out.  
  }
  
  public int outsize(String x1,String x2) {
  
  return x1.length()+x2.length();;
  
  }
  
  }
  
  
  
  執行的的命令
  
  javac testfacea.java
  
  ren testfacea.class testfacea.file
  
  
  
  3) 在主程序中調入文件到byte[]中,可以在文件可以在本地,也可用網絡無論如何只要能將編譯后的文件內容的類代碼放到 byte[]當中就可以
  
  
  
  java.io.FileInputStream in=new java.io.FileInputStream(namefile);
  
  
  
  byte[] classbyte=new byte[maxsize];
  
  
  
  4) 轉換成一個Class并初始化
  
  
  
  return defineClass(classname,classbyte,0,readsize);
  
  
  
  5) 實現接口
  
  實際上就是對一個接口類用調入的文件實現,當然可以用不同的文件進行不同的實現也可以對一個文件進行加解密操作,
  
  //方法 1 的例子代碼,newface是本地接口類,newface.class本地已經存在 開始
  
  testc=cl.load("testfacea.file","testfacea");
  
  testo=testc.newInstance();
  
  ((newface)testo).out("方法1 第(1)種使用方法");
  
  System.out.println("outsize="+((newface)testo).outsize("1111","aaaa"));
  
  或
  
  
  
  testc=cl.load("testfacea.fisle","testfacea");
  
  testo=testc.newInstance();
  
  newface newface1=(newface)testo;
  
  newface1.out("方法1 第(2)種使用方法");
  
  System.out.println("outsize="+newface1.outsize("22222","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();
  
  // 共用初使化參數,結束
  
  
  
  //方法 1 的例子代碼,newface是本地接口類,newface.class本地已經存在 開始
  
  testc=cl.load("testfacea.file","testfacea");
  
  testo=testc.newInstance();
  
  
  
  ((newface)testo).out("方法1 第(1)種使用方法");
  
  System.out.println("outsize="+((newface)testo).outsize("1111","aaaa"));
  
  
  
  testc=cl.load("testfacea.fisle","testfacea");
  
  testo=testc.newInstance();
  
  newface newface1=(newface)testo;
  
  newface1.out("方法1 第(2)種使用方法");
  
  System.out.println("outsize="+newface1.outsize("22222","bbbbb"));
  
  //方法 1 的例子代碼,結束
  
  }
  
  }
  
  /*
  
  要想自己完成從一個 byte[] 轉換到一個Class 必須要 extends ClassLoader
  
  因為ClassLoader中的方法defineClass是 protected 要使用只有 extends ClassLoader
  
  */
  
  class cloader extends ClassLoader {
  
  static int maxsize=10000;
  
  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,0,readsize);
  
  }
  
  }
  
  
  
  
  
  
  
  方法2
  
  不使用本地接口類的方法,這種方法class從文件定義成一個class和方法1是相同的,但要使用這個class就不同了,這種方法不需要接口類,
  
  1) 寫一個類 testfacea.class (本例中為了方便還是使用了testfacea,實際上已經可以不用 implements newface,即可以完全不用接口類)
  
  public class testfacea {
  
  public void out(String xx) {
  
  System.out.println(xx+" for testfacea ");
  
  }
  
  public int outsize(String x1,String x2) {
  
  return x1.length()+x2.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
  
  }
  
  }
  
  
  
  
  
  
  
  2) 生成 testfacea.class 更名為 testfacea.file 或其它文件名也可以
  
  
  
  生成 listinfo.class 更名為 listinfo.file 或其它文件名也可以
  
  
  
  執行的的命令
  
  
  
  javac testfacea.java
  
  
  
  ren testfacea.class testfacea.file
  
  
  
  javac listinfo.java
  
  
  
  ren listinfo.class listinfo.file
  
  
  
  3) 主程序中調入文件到byte[]中,可以在本地文件調用,也可用網絡無論如何只要能將

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久国产精品久久久久久久久久 | 精品国产一区二区三区四区在线 | 国产一精品久久99无吗一高潮 | 久草视频在线看 | 国产一级免费不卡 | 永久av在线免费观看 | 成年免费观看视频 | 精品一区二区久久久久久按摩 | 久久亚洲精品国产 | 91精品国产777在线观看 | 中文字幕一区二区三区久久 | 久久国产精品久久精品国产演员表 | 91精品国产综合久久婷婷香蕉 | 激情视频免费观看 | chinesehd天美原创xxxx | 国产一区二区三区四区波多野结衣 | 久久色播 | 国产精品刺激对白麻豆99 | 欧美激情图区 | 97zyz成人免费视频 | 一级做受毛片免费大片 | 欧美大屁股精品毛片视频 | 亚洲一区成人在线 | 老a影视网站在线观看免费 国产精品久久久久久久久久尿 | 国产精品久久久久久久av三级 | 久久精品国产久精国产 | 久草在线综合 | 在线免费观看毛片视频 | 日本一区视频在线观看 | 深夜福利视频绿巨人视频在线观看 | 亚洲九九色 | 日韩精品一区二区三区中文 | 国产一区二区视频在线播放 | 免费视频www在线观看 | 国产精品久久久网站 | 免费a级毛片大学生免费观看 | 羞羞答答xxdd在线播放 | 逼特逼视频在线观看 | 国产一区二区三区色淫影院 | 精品国产一区二区三区久久久 | 91精品国产乱码久久久久久久久 |