java自定义classloader_java自定义ClassLoader加载指定的class文件操作
继承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文件操作相关推荐
- java的classloader_java自定义ClassLoader加载指定的class文件操作
继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo 首先定义一个类,比如MyTest,并且 ...
- Spring Boot加载指定属性文件
我们可以通过@PropertySource注解来加载指定的属性文件,可以将配置文件内的属性映射到我们的controller.service和实体类里面去. 下面来介绍配置过程: 1.添加依赖: < ...
- Spring Boot @PropertySource注解加载指定配置文件(五)
我们可以通过@ConfigurationProperties和@Value两个注解获取主配置文件application.properties 或 apllication.yml中的配置信息,但是如果我 ...
- Java Class的热替换 自定义ClassLoader加载.class
本文是java热替换的实验,参考了 Java 类的热替换 -- 概念.设计与实现 http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/i ...
- 图解classloader加载class的流程及自定义ClassLoader
http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有B ...
- java使用jdbc连接oracle,实现自定义sql查询,加载字段注释
java使用jdbc连接oracle,实现自定义sql查询,加载字段注释 第一步.加载驱动 引用包 import java.sql.Connection; import java.sql.Driver ...
- Java的ClassLoader加载是怎么保证安全的?
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 1.类加载机制 Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个 ...
- php自动加载指定类,PHP自动加载类-Java架构师必看
test.php 当前目录下有j.phpPHP test.php function __autoload($class_name) { require_once $class_name . '.php ...
- pytorch dataset自定义_PyTorch 系列 | 数据加载和预处理教程
原题 | DATA LOADING AND PROCESSING TUTORIAL 作者 | Sasank Chilamkurthy 原文 | https://pytorch.org/tutorial ...
最新文章
- 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)
- C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)
- 「重返18岁」!英特尔首任CTO重磅回归,以CEO身份重掌帅印
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- STM32 中JTAG 引脚作为普通IO口设置方法
- CentOS6.3环境下openresty安装drizzle模块
- c语言程序窗口后台持续监测,用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序...
- HTML 代码常用技巧
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- php $r,PHP
- java tomcat重启linux_Linux下tomcat重启
- 去掉iPhone、iPad的默认按钮样式
- 比python更精简的语言,两行代码抓取淘宝/京东平台的商品数据--Uibot
- 如何在宝贝描述里加旺旺图标和免费电话
- 生活中的逻辑谬误07.中间立场假两难推理
- 32位无符号整数快开方函数
- 怎么成为一个优秀的面试官
- matlab冒号分号区别,matlab : 关于冒号 用法大全以及实例
- Fiat-Shamir heuristic(含实现)和Random oracle
- LTE学习笔记:物理层
热门文章
- rabbitmq添加user及vhost
- Jmeter-【JSON Extractor】-响应结果中数组多个相同key取值
- mysql数据库之联表查询
- 四:Jquery-animate
- visual studio 2015 2017 key vs2015 vs2017密钥
- 使用IDEA在Maven中创建MyBatis逆向工程以及需要注意的问题(入门)
- redis同步到磁盘
- [bzoj2588] Count on a tree
- LOJ.114.K大异或和(线性基)
- 树形DP(简单题)(Y HDU4705)