Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

66
LINES

< > BotCompany Repo | #1031279 // Change module's class loader at runtime Spike [OK]

JavaX source code (Dynamic Module) [tags: use-pretranspiled] - run with: Stefan's OS

Uses 1113K of libraries. Click here for Pure Java version (7679L/43K).

1  
!7
2  
3  
set flag DynModule. // use OS transpiler
4  
5  
// We are trying to add classes directly in to the module's class loader
6  
// without any sub-class loaders
7  
8  
cprint {
9  
  transient ClassLoader cl;
10  
  
11  
  start-thread {
12  
    cl = getClassLoader(module());
13  
    print("My class loader: " + cl);
14  
    print("Class loader type: " + className(cl));
15  
    Map<S, ClassLoader> parents = cast getOpt parentMap(cl);
16  
    print("Parents: " + parents);
17  
    
18  
    hotwireTest();
19  
  }
20  
  
21  
  void hotwireTest ctex {
22  
    S name = aGlobalID();
23  
    print("Class name: " + name);
24  
    S mcName = "main_" + name;
25  
    S src = "mainClassName " + mcName + "\n\n"
26  
      + "sclass " + name + " {\n"
27  
      + "  S name() {\n"
28  
      + "    ret " + quote("I am " + name) + ";\n"
29  
      + "  }\n"
30  
      + "}";
31  
    print();
32  
    printWithIndent("SRC> ", src);
33  
    print();
34  
    
35  
    // taken from veryQuickJava3
36  
    new LS libs;
37  
    src = transpileRaw(src); // transpiled, with lib references
38  
    
39  
    // taken from veryQuickJava_finish
40  
    src = findTranslators2(src, libs);
41  
    S dehlibs = join(" ", libs);
42  
    File bytecode = javaCompile_overInternalBot(src, dehlibs);
43  
    print(+bytecode);
44  
    print("Files: " + listZip(bytecode));
45  
    
46  
    //print("Name: " + call(o, "name"));
47  
    
48  
    /*set(cl, findClass_extension := (IF1<S, Class>) name -> {
49  
      if (equalsOrStartsWithPlusDollar(name, mcName))
50  
      null;
51  
    });*/
52  
    
53  
    call(cl, "addURL", bytecode.toURI().toURL());
54  
    
55  
    Class c = Class.forName(mcName);
56  
    print("Resolved: " + c);
57  
    
58  
    O o = newInstance(Class.forName(mcName + "$" + name));
59  
    print("Instance: " + o);
60  
    print();
61  
    O result = call(o, "name");
62  
    print("Result of function call: " + result);
63  
    
64  
    assertEquals("I am " + name, result);
65  
  }
66  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt

No comments. add comment

Snippet ID: #1031279
Snippet name: Change module's class loader at runtime Spike [OK]
Eternal ID of this version: #1031279/25
Text MD5: 6377dfec0492122847e8bb8ef4faf6ab
Transpilation MD5: 4e90c0bc1435d2e9038cb811e69187ed
Author: stefan
Category: javax
Type: JavaX source code (Dynamic Module)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2021-06-02 18:13:10
Source code size: 1806 bytes / 66 lines
Pitched / IR pitched: No / No
Views / Downloads: 200 / 405
Version history: 24 change(s)
Referenced in: [show references]