`
kanwoerzi
  • 浏览: 1643839 次
文章分类
社区版块
存档分类
最新评论

自定义类加载器

 
阅读更多
  1. packagecom;
  2. importjava.io.*;
  3. importjava.net.*;
  4. importjava.util.*;
  5. importjava.lang.reflect.Method;
  6. publicclassCustomClassLoaderextendsURLClassLoader{
  7. privateFileInputStreaminput=null;//文件输入流
  8. privateByteArrayOutputStreamout=null;//字节数组输出流
  9. privateString[]url=null;//类文件加载路径
  10. privatebyte[]data=null;//类文件字节码
  11. privateStringextensionalName="";//类文件扩展名
  12. publicCustomClassLoader(URL[]urls)throwsException{
  13. super(urls);
  14. this.url=newString[urls.length];
  15. for(inti=0;i<urls.length;i++){
  16. this.url[i]=urls[i].toURI().toString();
  17. }
  18. }
  19. /*
  20. *解析URL
  21. */
  22. privatevoidsetFilePath(){
  23. for(inti=0;i<this.url.length;i++){
  24. if(this.url[i].substring(0,4).toLowerCase().equals("file")==true){
  25. this.url[i]=this.url[i].substring(5);
  26. }
  27. }
  28. }
  29. /*
  30. *获得指定类名(包名+类名)文件的字节码
  31. *@namenameString
  32. *@returnbyte[]
  33. */
  34. privatebyte[]getFileData(Stringname){
  35. try{
  36. this.setFilePath();
  37. for(Stringurl:this.url){
  38. StringfileName=url+name.replace('.','/').concat(".")+
  39. this.getExtensionalName();
  40. input=newFileInputStream(newFile(fileName));
  41. if(input!=null){
  42. break;
  43. }
  44. }
  45. out=newByteArrayOutputStream();
  46. data=newbyte[1024];
  47. intlen=-1;
  48. while((len=input.read(data))!=-1){
  49. out.write(data,0,len);
  50. }
  51. data=out.toByteArray();
  52. }catch(Exceptione){
  53. e.printStackTrace();
  54. }finally{
  55. try{
  56. if(input!=null)
  57. input.close();
  58. if(out!=null)
  59. out.close();
  60. returndata;
  61. }catch(Exceptione){
  62. e.printStackTrace();
  63. returnnull;
  64. }
  65. }
  66. }
  67. /*
  68. *根据指定类名查找类文件
  69. *@paramnameString
  70. *@returnClass
  71. */
  72. protectedClassfindClassByName(Stringname){
  73. try{
  74. byte[]data=this.getFileData(name);
  75. if(data==null){
  76. returnnull;
  77. }
  78. returnthis.defineClass(name,data,0,data.length);
  79. }catch(Exceptione){
  80. e.printStackTrace();
  81. returnnull;
  82. }
  83. }
  84. /*
  85. *重写loadClass()方法
  86. *@paramnameString
  87. *@returnClass
  88. */
  89. publicClassloadClass(Stringname){
  90. Classc=null;
  91. try{
  92. c=super.loadClass(name);
  93. }catch(ClassNotFoundExceptione){
  94. e.printStackTrace();
  95. }finally{
  96. if(c==null)//父类默认方法没有加载到指定类时,使用自定义方法查找
  97. c=this.findClassByName(name);
  98. returnc;
  99. }
  100. }
  101. publicStringgetExtensionalName(){
  102. returnextensionalName;
  103. }
  104. publicvoidsetExtensionalName(StringextensionalName){
  105. this.extensionalName=extensionalName;
  106. }
  107. publicstaticvoidmain(String[]args)throwsException{
  108. URL[]url=newURL[]{newURL("file:e:/")};//添加你想要加载类的路径
  109. //网络或本地均可
  110. CustomClassLoadercsl=newCustomClassLoader(url);
  111. csl.setExtensionalName("rs");
  112. Classc1=csl.loadClass("com.demo");
  113. Objectobj=c1.newInstance();
  114. Methodmethod=c1.getMethod("printText",null);
  115. method.invoke(obj,null);
  116. }
  117. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics