动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.修成JAVA高手的基本素养.
.Javascript实例教程(5) 在一个表.
.Struts VS Spring 两种MVC框架比.
.EJB3 实体组件在 J2SE 中的使用.
.拖放 Eclipse Workbench 标签.
.关于Java单元测试中的伪对象介绍.
.J2ME学习笔记(1)—平台介绍及简单.
.NaN 属性.
.使用 Struts 提供的 HTML 标签库.
.Jini技术介绍(一).
.阴阳历算法.
.Java教室: Garbage Collection 清.
.Java入门:缓冲区溢出编程心得.
.Sun用AppServer8.0反击对手.
.用Java线程获取优异性能(I)??介.
.Castor JDO 入门.
.Axis下 WebService 的调用问题.
.调整JavaTM 的I/O性能(四)(zt).
.JDBC 3.0 RowSet, 类似于windows.
.Java Socket编程(三) 服务器So.

在运行时刻从文件中调入Class

发表日期:2008-1-5 |



  前言:
  
  了解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.println(xx+" for testfacea ");
  
  }
  
  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[]中,可以在本地文件调用,也可用网络无论如何只要能将
上一篇:.NET跨平台的第一步 人气:671
下一篇:Java联网增强技术 人气:408
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-4 LPLY CMS 网站管理系统 v5.0
2008-9-4 缤纷互动视频交友 v3.01.902
2008-9-4 ADN视频收藏专家 v3.0 bulid 080
2008-9-4 天空网络电影系统SKYUC v2.5.6 简
2008-9-4 Web Wiz Rich Text Editor(文本编
2008-9-4 幻影动漫网视频系统(Ppdong) v1.
2008-9-4 乐维电脑在线DIY配置系统
2008-9-4 老樊文章管理系统SQL版
2008-9-4 ASP.NET 2.53 缩略图水印组件源码
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵