java自定义ClassLoader加载指定的class文件操作
作者:lijie_cq 发布时间:2022-03-16 16:19:07
标签: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;
}
}
输出结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_20641565/article/details/78744677
0
投稿
猜你喜欢
- SharedPreferences在开发过程中,数据存取是较为频繁的,今天我们来了解下android几种常见的数据存取方式。在Android
- 本文实例为大家分享了java实现双色球抽奖的具体代码,供大家参考,具体内容如下实现双色球先考虑整体思路:1.随机生成7位数的数组为大奖号码(
- mybatis-plus自动配置mapper.xml与java接口映射本来没有mybatis-plus的话,这个工作是通过mybatis-s
- 1.创建一个线程Java操作线程最核心的类就是Thread类创建线程有很多方法,下面我们写一个Mythread类继承 Thread 类重写r
- 本文实例为大家分享了java利用数组随机抽取幸运观众的具体代码,供大家参考,具体内容如下思想:首先将所有观众姓名生成数组,然后获取数组元素的
- 这篇文章主要介绍了SpringBoot下如何实现支付宝接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 在线程中有两种常用的方法,能够通过数组实现相应的功能,但除此之外在区别上也是很明显的。本篇就其中的代表方法ArrayList和Vector进
- 前言枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型:public enum Color
- 好久就想着好好搭建一个ssm框架,自己以后用也方便吧,但是最近的事真的是很多,很多事情都没有去干,有时候自己会怀疑一下人生自己该不该去做程序
- Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人
- 自定义 webflux 容器配置配置代码@Componentpublic class ContainerConfig extends Rea
- 实现“摇一摇”功能,其实很简单,就是检测手机的重力感应,具体实现代码如下:1、在 AndroidManifest.xml 中添加操作权限2、
- 概述java移位符主要包括3种:运算符名称>>左移运算符<<有符号右移运算符<<<无符号右移运算符
- 用了MyBatis的同行,应该见过foreach,它一般是这样用的:<select id="foreachTest"
- mybatis 传入null值解决前端传入两个值,如果其中一个为null时,很多时候我们都很困惑,明明传入的是null,为啥mybatis
- 整理文档,java 动态增加定时任务示例,直接上代码。import org.apache.tools.ant.util.DateUtils;
- Java获取环境变量Java 获取环境变量的方式很简单: System.getEnv() 得到所有的环境变量Syste
- Android中获取资源 id 及资源 id 的动态获取我们平时获取资源是通过 findViewById 方法进行的,比如我们常
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- 项目场景:适用于接口数据敏感信息,比如 明文传输姓名、居住地址、手机号等信息,如果存在明文传输敏感数据问题、及数据泄漏风险,则可使用此方法加