java.lang.SecurityException: Prohibited package name: java.lang
/*
定义一个要加载的程序类Demo
将生成的Demo.class 文件保存到D盘(路径D:\Demo.class)
*/
public class Demo {
publicvoid show() {
System.out.println("showis running");
}
}
/**
* @author zhangjingxian
* 继承classLoader的方法实现自定义类加载器的定义
*/
public class MyClassLoader extends ClassLoader{
/**
*
* @param fis 用来读取class文件的输入流
* @param className 类的全路径名 比如 com.itheima.domain.Student
* @return
* @throws Exception
*/
public Class<?>loadAndGetMyClass(InputStream fis, String className) throws Exception {
// 新建一个 内存输出流
ByteArrayOutputStreambos = new ByteArrayOutputStream();
// 把读到的 class文件写到内存中
fis.transferTo(bos);
// 把class文件里的每个字节放到内存数组 返回。
byte[] bytes =bos.toByteArray();
if (bytes!=null){
/*
由于需要将加载的二进制数据文件转为Class类的处理,所以可以使用ClassLoader提供的defineClass()方法实现转换。
*/
return super.defineClass(className,bytes,0,bytes.length);
}
return null;
}
}
public class MyClassLoaderTest {
public static void main(String[] args) throws Exception {
//创建自己定义的类加载器
MyClassLoader mcl = new MyClassLoader();
// 创建一个 从Demo.class读取的输入流
FileInputStream fis = new FileInputStream("d:/Demo.class");
//读取class文件并 返回该jvm能识别的class对象
Class<?> demo = mcl.loadAndGetMyClass(fis, "Demo");
//创建该类对象
Object o = demo.getDeclaredConstructor().newInstance();
//获取该类的show方法
Method show = demo.getDeclaredMethod("show");
//show方法执行
show.invoke(o);
}
}
/*
定义一个要加载的程序类Demo
将生成的Demo.class 文件保存到D盘(路径D:\Demo.class)
*/
public class Demo {
publicvoid show() {
System.out.println("showis running");
}
}
/**
* @author zhangjingxian
* 继承classLoader的方法实现自定义类加载器的定义
*/
public class MyClassLoader extends ClassLoader{
/**
*
* @param fis 用来读取class文件的输入流
* @param className 类的全路径名 比如 com.itheima.domain.Student
* @return
* @throws Exception
*/
public Class<?>loadAndGetMyClass(InputStream fis, String className) throws Exception {
// 新建一个 内存输出流
ByteArrayOutputStreambos = new ByteArrayOutputStream();
// 把读到的 class文件写到内存中
fis.transferTo(bos);
// 把class文件里的每个字节放到内存数组 返回。
byte[] bytes =bos.toByteArray();
if (bytes!=null){
/*
由于需要将加载的二进制数据文件转为Class类的处理,所以可以使用ClassLoader提供的defineClass()方法实现转换。
*/
return super.defineClass(className,bytes,0,bytes.length);
}
return null;
}
}
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建Socket对象 用于访问 本机 上的8888端口服务端
Socket s = new Socket("127.0.0.1",8888);
// 获取输出流
OutputStream outputStream = s.getOutputStream();
//创建读取Demo.class的输入流
FileInputStream fis = new FileInputStream("d:/Demo.class");
//把Demo.class的字节 通过输出流 发给服务端
fis.transferTo(outputStream);
//关闭资源
fis.close();
s.close();
}
}
public class ServerDemo {
public static void main(String[] args) throws Exception {
// 在本机上创建 服务端,绑定端口8888
ServerSocket ss = new ServerSocket(8888);
//接收 客户端的请求
Socket s = ss.accept();
//创建类加载器
MyClassLoader mcl = new MyClassLoader();
//把从客户端读入的字节 通过自定义类加载器的处理 返回一个 jvm识别的Class对象
Class<?> demo = mcl.loadAndGetMyClass(s.getInputStream(), "Demo");
//创建该类对象
Object o = demo.getDeclaredConstructor().newInstance();
//获取该类的show方法
Method show = demo.getDeclaredMethod("show");
//show方法执行
show.invoke(o);
//关闭资源
s.close();
// 关闭服务器
ss.close();
}
}
5.png (31.27 KB, 下载次数: 122)
6.png (145.53 KB, 下载次数: 118)
7.png (96.33 KB, 下载次数: 121)
8.png (62 KB, 下载次数: 116)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |