继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo

首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /Users/allen/Desktop/cn/lijie/MyTest.class

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/" + 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;

}

}

测试的主函数:

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远程加载class文件

1.在win上创建java文件并编译

2.上传到远程服务器

3.编写java代码

准备:

引入jar包 ganymed-ssh2-262.jar

1.加载外部class要定义自己的类加载器

2.使用内存流

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_java自定义ClassLoader加载指定的class文件操作相关推荐

  1. java自定义classloader_java自定义ClassLoader加载指定的class文件操作

    继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo 首先定义一个类,比如MyTest,并且 ...

  2. Java Class的热替换 自定义ClassLoader加载.class

    本文是java热替换的实验,参考了 Java 类的热替换 -- 概念.设计与实现 http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/i ...

  3. 加载项找不到java,未显示自定义Outlook加载项

    我使用VSTO开发了outlook插件,并使用Visual Studio Installer安装了插件 . 安装后我可以在outlook中看到安装了自定义加载项(在File-Option-Add-In ...

  4. Spring Boot加载指定属性文件

    我们可以通过@PropertySource注解来加载指定的属性文件,可以将配置文件内的属性映射到我们的controller.service和实体类里面去. 下面来介绍配置过程: 1.添加依赖: < ...

  5. Spring Boot @PropertySource注解加载指定配置文件(五)

    我们可以通过@ConfigurationProperties和@Value两个注解获取主配置文件application.properties 或 apllication.yml中的配置信息,但是如果我 ...

  6. ​​​​​​​CV:利用cv2(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5、性别hdf5)并标注

    CV:利用cv2+自定义load_detection_model(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5.性别h ...

  7. 【ClassLoader】实现自定义类加载器加载指定路径下的Class文件和Jar包

    文章目录 前言 自定义类加载器加载.class文件 自定义类加载器加载jar包文件 前言 在web开发中,一般我们是不需要去自己实现类加载器的,常见的web容器已经帮我们实现了指定路径下的加载,比如我 ...

  8. 图解classloader加载class的流程及自定义ClassLoader

    http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有B ...

  9. Java的ClassLoader加载是怎么保证安全的?

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 1.类加载机制 Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个 ...

最新文章

  1. 渗透测试 回显机制平台 dnslog 搭建
  2. eBay数据科学家李睿:自然语言处理在eBay的技术实践 数据 网络 类别 技术 分类器 阅读1593 近日,在飞马网主办的“FMI人工智能大数据高峰论坛”上,来自eBay的数据科学家李睿
  3. 在页面中隐藏数据库某信息并显示该信息对应的字典编码名称(后台ssh框架,前台extjs)
  4. 前端 <table><td><tr><th>
  5. PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳。在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据。即使使用了第二个参数,也会重复,最好的方案是结
  6. python统计句子中单词个数_【python统计单词数量】作文写作问答 - 归教作文网
  7. Could not find artifact com.sun:tools:jar:1.5.0
  8. 2019 CCF CSP-J2题解
  9. 【codevs1052】地鼠游戏
  10. TensorFlow 学习------第二天
  11. c# Conditional用法详解
  12. Zookeeper集群leader选举机制
  13. 使用DFA算法模型构建敏感词过滤器
  14. Python微信文章 抓取转PDF
  15. 如何修改chrome账号密码自动填充的字体样式
  16. 正则表达式(二)验证邮箱、电话号码
  17. python导入siri_python利用不到一百行代码实现一个小siri
  18. 最左推导和最右推导,语法树,二义性文法
  19. java List的stream()方法解析
  20. vue封装qq表情包和符号表情的发送

热门文章

  1. iptables配置的相关知识点
  2. bit rate - 比特率
  3. 苹果CMSv10忘记管理员密码怎么找回的详细教程
  4. 公司深信服AC1200不能上网排错
  5. 微信小程序之图片删除
  6. Linking Structure and Function in Macroscale Brain Networks——从宏观尺度脑网络的角度看结构--功能关系
  7. 密集波分复用(DWDM)技术的优势
  8. 认识非编系统软件EDIUS Pro 9
  9. 【Linux】循序渐进学运维-day01
  10. 新冠插值法matlab_如何用MATLAB 编写interpl插值函数