La clase Java carga la operación de clase especificada

Este artículo presenta principalmente el ClassLoader personalizado de Java para cargar la operación de archivo de clase especificada, que tiene un buen valor de referencia, y espero que sea útil para todos. Sigamos al editor para echar un vistazo

Puede personalizar un cargador de clases heredando ClassLoader y anulando el método findClass. Qué es un cargador de clases y el proceso de carga y la secuencia del cargador de clases se discutirá la próxima vez. Aquí hay una pequeña demostración

Primero defina una clase, como MyTest, y compílela en un archivo de clase, y luego colóquela en una carpeta específica. Las últimas capas de la carpeta son su nombre de paquete. Aquí coloco la clase compilada en: / Users / allen /Desktop/cn/lijie/MyTest.class
Inserte la descripción de la imagen aquí

package cn.lijie;
public class MyTest {
    
    
  public void show() {
    
    
    System.out.println("show test!");
  }
}
自定义的类加载器:

`public` `class` `MyClassLoader` `extends` `ClassLoader {
    
    `

`@Override`

`protected` `Class<?> findClass(String name) {
    
    `

`String myPath =` `"[file:///Users/allen/Desktop/](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;`

`}`

`}`

La función principal de la prueba:

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

Ejecute la función principal y llame al método show de la clase externa:

Inserte la descripción de la imagen aquí

Suplemento: archivo de clase de carga remota de Java
1. Cree un archivo de Java en win y compile

Inserte la descripción de la imagen aquí

2. Subir al servidor remoto

Inserte la descripción de la imagen aquí

3. Preparación para escribir código java
:
introducción del paquete jar ganymed-ssh2-262.jar

  • 1. Para cargar una clase externa, defina su propio cargador de clases

  • 2. Utilice la transmisión de memoria

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; 
 } 
}

Resultado de salida:
Inserte la descripción de la imagen aquí

Lo anterior es una experiencia personal, espero poder darle una referencia y espero que pueda apoyar al editor. Si hay errores o no se consideran por completo, no dude en aclararme.

Supongo que te gusta

Origin blog.csdn.net/dcj19980805/article/details/115247234
Recomendado
Clasificación