一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java自定義ClassLoader加載指定的class文件操作

java自定義ClassLoader加載指定的class文件操作

2021-08-11 11:45lijie_cq Java教程

這篇文章主要介紹了java自定義ClassLoader加載指定的class文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

繼承classloader并且重寫findclass方法就可以自定義一個(gè)類加載器,具體什么是類加載器以及類加載器的加載過程與順序下次再說,下面給出一個(gè)小demo

首先定義一個(gè)類,比如mytest,并且將其編譯成class文件,然后放到一個(gè)指定的文件夾下面,其中文件夾的最后幾層就是它的包名,這里我將這個(gè)編譯好的類放到 : /users/allen/desktop/cn/lijie/mytest.class

java自定義ClassLoader加載指定的class文件操作

?
1
2
3
4
5
6
package cn.lijie;
public class mytest {
  public void show() {
    system.out.println("show test!");
  }
}

自定義的類加載器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class myclassloader extends classloader {
  @override
  protected class<?> findclass(string name) {
    string mypath = "file:///users/allen/desktop/" + name.replace(".","/") + ".class";
    system.out.println(mypath);
    byte[] classbytes = null;
    path path = null;
    try {
      path = paths.get(new uri(mypath));
      classbytes = files.readallbytes(path);
    } catch (ioexception | urisyntaxexception e) {
      e.printstacktrace();
    }
    class clazz = defineclass(name, classbytes, 0, classbytes.length);
    return clazz;
  }
}

測(cè)試的主函數(shù):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class mainclass {
  public static void main(string[] args) throws classnotfoundexception {
    myclassloader loader = new myclassloader();
    class<?> aclass = loader.findclass("cn.lijie.mytest");
    try {
      object obj = aclass.newinstance();
      method method = aclass.getmethod("show");
      method.invoke(obj);
    } catch (exception e) {
      e.printstacktrace();
    }
  }
}

執(zhí)行主函數(shù),調(diào)用外部class的show方法:

java自定義ClassLoader加載指定的class文件操作

補(bǔ)充:java遠(yuǎn)程加載class文件

1.在win上創(chuàng)建java文件并編譯

java自定義ClassLoader加載指定的class文件操作

2.上傳到遠(yuǎn)程服務(wù)器

java自定義ClassLoader加載指定的class文件操作

3.編寫java代碼

準(zhǔn)備:

引入jar包 ganymed-ssh2-262.jar

1.加載外部class要定義自己的類加載器

2.使用內(nèi)存流

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.io.bytearrayoutputstream;
import java.io.ioexception;
import java.io.inputstream;
import ch.ethz.ssh2.connection;
import ch.ethz.ssh2.sftpinputstream;
import ch.ethz.ssh2.sftpv3client;
public class fs{
 public static void main(string[] args) throws exception {
 ownclassloader ocl = new ownclassloader();
 string ip,user,password;
 ip = "120.34.168.80";//自己的遠(yuǎn)程ip
 user = "root";//username
 password = "123456";//password
 ocl.login(ip, user, password);
 object obj = ocl.loadeothclass("/opt/4/tt.class");//class文件路徑
  
 system.out.println(obj);
 class c = obj.getclass();
 field f = c.getdeclaredfield("age");
 f.setaccessible(true);
 system.out.println("age:"+f.get(obj));
 }
}
//自定義類加載器
class ownclassloader extends classloader{
 private connection conn = null;
 //初始化鏈接
 public connection login(string ip,string user,string password){
 connection conn = null;
 try {
  //也可以new connection(ip, port)創(chuàng)建對(duì)象,默認(rèn)22
  conn = new connection(ip);
  //連接遠(yuǎn)程服務(wù)
  conn.connect();
  //使用用戶名和密碼登錄
  conn.authenticatewithpassword(user, password);
  this.conn = conn;
     return conn;
 } catch (ioexception e) { 
  e.printstacktrace();
  }
  return null;
 }
 //返回遠(yuǎn)程實(shí)例
 public object loadeothclass(string url) throws exception{
 if(null==conn)
  throw new exception("請(qǐng)初始化鏈接");
 sftpv3client sc = new sftpv3client(conn);//創(chuàng)建ssh客戶端連接
 inputstream is = new sftpinputstream(sc.openfilero(url));//創(chuàng)建輸入流
 byte[] b = this.readclassfile(is);
 class<?> c = super.defineclass(b, 0, b.length);//定義class
 return c.newinstance();//創(chuàng)建實(shí)例
 }
 //讀取遠(yuǎn)程class文件
 private byte[] readclassfile(inputstream is){
 byte[] b = new byte[1024];
 int len;
 bytearrayoutputstream bos = null;
 try {
  bos = new bytearrayoutputstream();//內(nèi)存流輸出
  while((len=is.read(b))!=-1){
  bos.write(b, 0, len);
  }
  b = bos.tobytearray();
 } catch (exception e) {
  // todo auto-generated catch block
  e.printstacktrace();
 }finally{
  try {
  if(is!=null)
   is.close();
  if(bos!=null)
   bos.close();
  } catch (exception e2) {
  // todo: handle exception
  }
 }
 return b;
 }
}

輸出結(jié)果:

java自定義ClassLoader加載指定的class文件操作

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://blog.csdn.net/qq_20641565/article/details/78744677

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日韩欧美在线观看不卡 | 性插图动态图无遮挡 | 成人国产精品视频 | 色屁屁www | 国产视频三区 | 变形金刚第一部 | 99久久精品国产综合一区 | 欧美va天堂va视频va在线 | 四虎影院观看 | 国产精品久久免费 | 亚洲成人影院在线 | 日本免费观看95视频网站 | 2021国产精品视频 | 国产一区二区三区在线看 | bt天堂在线最新版在线 | 麻豆网站在线观看 | 无码乱人伦一区二区亚洲一 | 久久全国免费久久青青小草 | 纲手被comic天堂 | 涩涩屋在线播放 | 日本三级免费观看 | 日本www色| 人人爽人人射 | 99re精品在线 | 亚洲精品一区二区久久这里 | 99 久久99久久精品免观看 | 极品美女写真菠萝蜜视频 | 操动漫美女视频 | 四虎永久在线精品免费影视 | 婷婷丁香视频 | 国产欧美视频一区二区三区 | 香蕉免费一区二区三区 | 成人a级特黄毛片 | 好姑娘在线观看完整版免费 | 国产伦码精品一区二区三区 | 久久精品人人做人人爽97 | 青青青国产| 欧美交换乱理伦片120秒 | 国产精品天天在线 | 亚洲欧美日韩高清 | 粉嫩国产14xxxxx0000 |