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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

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

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

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

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

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

首先定義一個類,比如mytest,并且將其編譯成class文件,然后放到一個指定的文件夾下面,其中文件夾的最后幾層就是它的包名,這里我將這個編譯好的類放到 : /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;
  }
}

測試的主函數:

?
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();
    }
  }
}

執行主函數,調用外部class的show方法:

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

補充:java遠程加載class文件

1.在win上創建java文件并編譯

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

2.上傳到遠程服務器

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

3.編寫java代碼

準備:

引入jar包 ganymed-ssh2-262.jar

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

2.使用內存流

?
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";//自己的遠程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)創建對象,默認22
  conn = new connection(ip);
  //連接遠程服務
  conn.connect();
  //使用用戶名和密碼登錄
  conn.authenticatewithpassword(user, password);
  this.conn = conn;
     return conn;
 } catch (ioexception e) { 
  e.printstacktrace();
  }
  return null;
 }
 //返回遠程實例
 public object loadeothclass(string url) throws exception{
 if(null==conn)
  throw new exception("請初始化鏈接");
 sftpv3client sc = new sftpv3client(conn);//創建ssh客戶端連接
 inputstream is = new sftpinputstream(sc.openfilero(url));//創建輸入流
 byte[] b = this.readclassfile(is);
 class<?> c = super.defineclass(b, 0, b.length);//定義class
 return c.newinstance();//創建實例
 }
 //讀取遠程class文件
 private byte[] readclassfile(inputstream is){
 byte[] b = new byte[1024];
 int len;
 bytearrayoutputstream bos = null;
 try {
  bos = new bytearrayoutputstream();//內存流輸出
  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;
 }
}

輸出結果:

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久影院色老大 | 青青草影院在线观看 | 天天狠天天透天干天天怕处 | 国产玖玖在线 | 2021国产精品视频 | 日韩夫妻性生活 | 国产精品亚洲午夜不卡 | bban女同系列022在线观看 | 日噜噜 | 久久草福利自拍视频在线观看 | 亚洲精品成人 | 亚洲、国产综合视频 | 1024国产基地永久免费 | 无码国产成人午夜在线观看不卡 | 日本一区二区视频在线观看 | 亚洲美女人黄网成人女 | 妇乱子伦激情 | 麻豆在线观看 | 国产成人福利免费观看 | 日韩一级片免费观看 | 日本生活中的玛丽 | 欧美 亚洲 综合 卡通 另类 区 | 4tube高清性欧美 | 亚洲高清视频免费 | 欧美男同videos | 欧美猛男同志video在线 | 色悠久久久久综合欧美99 | 成年人免费在线播放 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 | 无颜之月5集全免费看无删除 | 久久综合亚洲色hezyo | 亚洲乱亚洲乱妇41p 亚洲乱码一区二区三区国产精品 | 叉逼视频| 欧美一级xxx | 欧美xxxxx性| xxxxxx性受 | 日本高清视频在线观看 | 久久毛片视频 | 白鹿扒开内裤露出尿孔 | 2022国产麻豆剧传媒古装 | www.av色|