Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/com/mashibing/jvm/heatload/GetPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mashibing.jvm.heatload;

public class GetPI {

// 本热部署实验中,上面的Darts函数没有用到,请忽略
public static void Output() {
System.out.println("Output");
}
}
112 changes: 112 additions & 0 deletions src/com/mashibing/jvm/heatload/HowswapCL.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package com.mashibing.jvm.heatload;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashSet;

/*
* 实现热部署,自定义ClassLoader,加载的是.class
*/
class HowswapCL extends ClassLoader {

private String basedir; // 需要该类加载器直接加载的类文件的基目录
private HashSet dynaclazns; // 需要由该类加载器直接加载的类名

public HowswapCL(String basedir, String[] clazns) {
super(null); // 指定父类加载器为 null
this.basedir = basedir;
dynaclazns = new HashSet();
loadClassByMe(clazns);
}

private void loadClassByMe(String[] clazns) {
for (int i = 0; i < clazns.length; i++) {
loadDirectly(clazns[i]);
dynaclazns.add(clazns[i]);
}
}

private Class loadDirectly(String name) {
Class cls = null;
StringBuffer sb = new StringBuffer(basedir);
String classname = name.replace('.', File.separatorChar) + ".class";
sb.append(File.separator + classname);
File classF = new File(sb.toString());
try {
cls = instantiateClass(name, new FileInputStream(classF), classF.length());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cls;
}

private Class instantiateClass(String name, InputStream fin, long len) {
byte[] raw = new byte[(int) len];
try {
fin.read(raw);
fin.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return defineClass(name, raw, 0, raw.length);
}

protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class cls = null;
cls = findLoadedClass(name);
if (!this.dynaclazns.contains(name) && cls == null) {
cls = getSystemClassLoader().loadClass(name);
}
if (cls == null) {
throw new ClassNotFoundException(name);
}
if (resolve) {
resolveClass(cls);
}
return cls;
}
}

/*
* 每隔500ms运行一次,不断加载class
*/
class Multirun implements Runnable {

public void run() {
try {
while (true) {
// 每次都创建出一个新的类加载器
// class需要放在自己package名字的文件夹下
String url = "D:\\D\\github\\JVM\\out\\production\\JVM\\";//System.getProperty("user.dir") + "/lib";// "/lib/yerasel/GetPI.jar";
HowswapCL cl = new HowswapCL(url, new String[]{"com.mashibing.jvm.heatload.GetPI"});
Class cls = cl.loadClass("com.mashibing.jvm.heatload.GetPI");
System.out.println(cls.getClassLoader());
System.out.println(GetPI.class.getClassLoader());
GetPI foo = (GetPI) cls.newInstance();
// 被调用函数的参数
foo.Output();
// Method m = foo.getClass().getMethod("Output", new Class[]{});
// m.invoke(foo, new Object[]{});
Thread.sleep(500);
}

} catch (Exception ex) {
ex.printStackTrace();
}
}
}
26 changes: 26 additions & 0 deletions src/com/mashibing/jvm/heatload/Test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.mashibing.jvm.heatload;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Test {

public static Method initAddMethod() {
try {
Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
add.setAccessible(true);
return add;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public static void main(String[] args) {

// 热部署测试代码
Thread t;
t = new Thread(new Multirun());
t.start();
}
}
16 changes: 16 additions & 0 deletions src/java/lang/Long.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package java.lang;

/**
* @Title: Long
* @Description: Long
* @Company:www.wrenchdata.com
* @author:shenshilong[shilong_shen@163.com]
* @date:2019-11-05
* @version:V1.0
*/
public class Long {

public static void main(String[] args) {
System.out.println(1);
}
}
16 changes: 16 additions & 0 deletions src/java/lang/Mys.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package java.lang;

/**
* @Title: Mys
* @Description: Mys
* @Company:www.wrenchdata.com
* @author:shenshilong[shilong_shen@163.com]
* @date:2019-11-05
* @version:V1.0
*/
public class Mys {

public static void main(String[] args) {
System.out.println(1);
}
}
56 changes: 56 additions & 0 deletions src/top/fineplug/splitfile/CutDemo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package top.fineplug.splitfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class CutDemo {
public static void main(String[] args) {
//调用cutFile()函数 传人参数分别为 (原大文件,切割后存放的小文件的路径,切割规定的内存大小)
cutFile("D:\\java\\cut\\ForrestGump.avi", "D:\\java\\cuts",1024 * 1024 * 20);
}

private static void cutFile(String src, String endsrc, int num) {
FileInputStream fis = null;
File file = null;
try {
fis = new FileInputStream(src);
file = new File(src);
//创建规定大小的byte数组
byte[] b = new byte[num];
int len = 0;
//name为以后的小文件命名做准备
int name = 1;
//遍历将大文件读入byte数组中,当byte数组读满后写入对应的小文件中
while ((len = fis.read(b)) != -1) {
//分别找到原大文件的文件名和文件类型,为下面的小文件命名做准备
String name2 = file.getName();
int lastIndexOf = name2.lastIndexOf(".");
String substring = name2.substring(0, lastIndexOf);
String substring2 = name2.substring(lastIndexOf, name2.length());
FileOutputStream fos = new FileOutputStream(endsrc + "\\\\"+ substring + "-" + name + substring2);
//将byte数组写入对应的小文件中
fos.write(b, 0, len);
//结束资源
fos.close();
name++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
//结束资源
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}