- 浏览: 375574 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
surpassno:
很不错,学习了
一个对象占用多少字节? -
ysyzww:
你这么牛逼,你父母知道吗
maven使用技巧 -
妖人不要跑:
JDK中反序列化对象的过程(ObjectInputStream#readObject) -
lanhz:
谢楼主,构建成功了
Mac OSX 10.9 上build openjdk8和openjdk7 -
zqb666kkk:
通过了吗 ?????
淘宝北京专场java面试题(2011-12-31)
自定义了个ClassLoader,用socket从一个server上获取class文件内容,然后创建一个类。tcp server是用erlang写的,只负责从硬盘读数据,然后传到自定义ClassLoader。特别注意的是,要想erlang socket跟java socket通信,gen_tcp:listen(Port,[binary,{packet,0}]),这里packet一定要为0,这个是erlang数据包的包头,通信的时候客户端跟服务端加的额外数据,跟java通信,是不能加的,否则会出现error msgsize这类的错误。
这里写死了类路径的,你也可自己写自己的。另外需要指明的是,自定义的类装载的的双亲装载器是在ClassLoader类的默认构造函数里设置的,通过getSystemClassLoader()得到的AppClassLoader。而自定义的ClassLoader只实现findClass方法,可以保留loadClass方法原先的双亲委派模型,不用自己去加载所有的类。
-module(class_file_server). -export([start/0,start/1,process_request/1]). -define(PORT,7777). -define(CLASS_NOT_FOUND,"class_not_found_exception"). start() -> start(?PORT). start(Port) -> case gen_tcp:listen(Port,[binary,{packet,0},{active,true}]) of {ok,Socket} -> process_request(Socket); {error,Reason} -> io:format("Fail to create socket: ~s ~n",[Reason]) end. process_request(Socket) -> case gen_tcp:accept(Socket) of {ok,From} -> spawn(class_file_server,process_request,[Socket]), receive_data_then_send_file(From); {error,closed} -> io:format("Failed to accept, for {error,closed}~n"); {error,Reason} -> io:format("Failed to accept: ~s~n",[Reason]); Other -> io:format("accept Other ~p~n",[Other]) end. receive_data_then_send_file(FromSocket) -> receive {tcp,FromSocket,Bin} -> io:format("receive some raw data: ~p ~n from ~p~n",[Bin,inet:peername(FromSocket)]), send_file(FromSocket,binary_to_list(Bin)), gen_tcp:close(FromSocket); {tcp_closed,FromSocket} -> io:format("processed one request:~p~n",[FromSocket]), gen_tcp:close(FromSocket); Other -> io:format("Invalid data: ~p~n",[Other]) end. send_file(FromSocket,FileName) -> case file:read_file(FileName) of {ok,Bin} -> gen_tcp:send(FromSocket,Bin); {error,Why} -> gen_tcp:send(FromSocket,?CLASS_NOT_FOUND), io:format("Failed to load class: ~p ~n because ~p~n",[FileName,Why]) end.
package classloader; public class RemoteClassLoader extends ClassLoader { protected Class<?> findClass(String name) throws ClassNotFoundException { DownloadManager manager = new DownloadManager(7777); try { byte[] data = manager.download(name); return defineClass(name, data, 0, data.length); } catch (ClassNotFoundException e) { return super.findClass(name); } } @SuppressWarnings("unchecked") public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ RemoteClassLoader loader = new RemoteClassLoader(); Thread.currentThread().setContextClassLoader(loader); // Class clazz = loader.loadClass("com.kingdee.eas.LoadedClazz"); Class clazz = Class.forName("com.kingdee.eas.LoadedClazz",true,loader); clazz.newInstance(); // clazz.newInstance(); } }
package classloader; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Arrays; public class DownloadManager { private static final String CLASS_NOT_FOUND = "class_not_found_exception"; private static final byte[] BYTES_CLASS_NOT_FOUND = CLASS_NOT_FOUND.getBytes(); private static final int SIZE = 204800; private int port; private byte[] result = new byte[SIZE * 10]; private byte[] buffer = new byte[SIZE]; public DownloadManager(int port) { super(); this.port = port; } public byte[] download(String name) throws ClassNotFoundException { // E:\\develop\\workspaces\\workspace-java\\jdbcdriver\\test\\com\\kingdee\eas\LoadedClazz.java String classFile = "E:\\develop\\workspaces\\workspace-java\\jdbcdriver\\bin\\" + name.replaceAll("\\.", "/") + ".class"; Socket socket = null; OutputStream out = null; InputStream in = null; int count = 0, totalCount = 0; try { socket = new Socket("192.168.18.27", this.port); // write to socket out = new BufferedOutputStream(socket.getOutputStream()); out.write(classFile.getBytes()); out.flush(); // read from socket in = new BufferedInputStream(socket.getInputStream()); while ((count = in.read(buffer)) > 0) { if (isEqual(BYTES_CLASS_NOT_FOUND, buffer, count)) { throw new ClassNotFoundException(classFile); } System.arraycopy(buffer, 0, result, totalCount, count); totalCount += count; } for (int i = 0; i < totalCount; i++) { System.out.print(String.format("%02X", result[i])); if ((i + 1) % 100 == 0) System.out.println(); } System.out.println(); return Arrays.copyOfRange(result, 0, totalCount); } catch (UnknownHostException e) { throw new ClassNotFoundException(classFile); } catch (IOException e) { throw new ClassNotFoundException(classFile); } finally { try { if (out != null) out.close(); if (in != null) in.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } private static boolean isEqual(byte[] dest, byte[] buffer, int size) { if (dest.length != size) return false; for (int i = 0; i < size; i++) { if (dest[i] != buffer[i]) return false; } return true; } /** * @param args * @throws IOException * @throws UnknownHostException * @throws ClassNotFoundException */ public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException { DownloadManager manager = new DownloadManager(7777); manager.download(""); } }
这里写死了类路径的,你也可自己写自己的。另外需要指明的是,自定义的类装载的的双亲装载器是在ClassLoader类的默认构造函数里设置的,通过getSystemClassLoader()得到的AppClassLoader。而自定义的ClassLoader只实现findClass方法,可以保留loadClass方法原先的双亲委派模型,不用自己去加载所有的类。
发表评论
-
springboot程序错误排查
2016-12-12 10:37 12072.0.0版本的springboot程序,在eclipse中 ... -
debug Java进程的debug参数
2016-08-25 21:13 1616前几天给java应用设置debug参数,发现有两个参数:- ... -
Java NIO Socket通信需要考虑的问题(持续更新)
2016-04-27 19:57 281. NIO 多个线程同时往 ... -
Fastjson反序列化泛型类型时候的一个问题
2015-01-21 15:34 32298import static org.junit.Asser ... -
HTTP 50X code实例
2014-10-31 19:24 01、500 Internal Server Err ... -
一次Direct buffer memory引发的OutOfMemoryError问题排查
2014-10-28 17:22 0留坑位 -
netty3.6.2中写数据的过程,以及写数据写不出去后怎么处理
2014-08-11 17:37 3139netty写数据的时候,会先放到一个缓存队 ... -
在用Netty 3.6.2发数据,发现内核缓冲区满的时候.....
2014-08-11 16:06 2218用nettys收发网络数据的时候,一般不会注 ... -
JDK中反序列化对象的过程(ObjectInputStream#readObject)
2014-06-10 20:10 4179此处,对象描述信息即ObjectStre ... -
Mac OSX 10.9 上build openjdk8和openjdk7
2014-03-29 18:29 14295先分享下自己build出来的fastdeb ... -
内存充足情况下应用一直CMS GC的问题分析
2014-03-26 22:39 0前几天日常上线发布后,收到大量的CMS GC ... -
查看java对象在内存中的布局
2014-03-20 22:39 13072接着上篇《一个对象占用多少字节?》中遇到的 ... -
一个对象占用多少字节?
2014-03-18 21:56 35132老早之前写过一篇博客,是关于一个Integ ... -
maven使用技巧
2014-03-18 15:34 39461、pom打jar包的时候设置MANIFEST.MF的ke ... -
cpu字长、操作系统字长和jvm中各数据类型占用的字节数关系
2014-03-16 02:05 4722cpu字长是指cpu同时参与运算的二进制位 ... -
比反射更高效的修改字段值的方法
2014-03-13 20:49 1383开发过程中,不少情况下都会遇到需要通过反射 ... -
cache line对内存访问的影响
2014-03-12 20:48 1382cache line对内存访问的影响很早就 ... -
Java Web应用Web层异步化应该考虑的问题
2014-01-25 17:45 5834之前做了一 ... -
jvisualvm jmx方式远程监控tomcat
2013-10-10 20:38 19851、如果用jmx方式监控,不需运行服务器上的jstatd进 ... -
一些数据切分、缓存、rpc框架、nosql方案资料
2013-10-07 23:48 14751、数据切分 ...
相关推荐
创建自定义Classloader需要继承java.lang.ClassLoader类,并重写其关键方法,如`findClass(String name)`或`loadClass(String name)`。这两个方法分别用于查找指定类的字节码和实际加载类。在`findClass`中,我们...
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;
当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar...
这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在Java中,类加载过程遵循双亲委派模型(Parent Delegation Model)。这...
自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`findClass()`来查找指定类的字节码。一旦找到,使用`defineClass()`方法将字节码转换为Class对象。 2. **...
- **方便添加Class和JAR**:自定义`ClassLoader`应该提供更灵活的方法,能够直接添加类和JAR,以适应不同的场景需求。 自定义`ClassLoader`的设计和实现是一个高级话题,需要深入理解Java的类加载机制。通过这种...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...
创建自定义类加载器需要继承ClassLoader类,并重写findClass()方法。在这个方法里,你可以编写代码来从指定的位置(例如,网络、文件系统或内存)读取类的字节码,并通过defineClass()方法将其转换为Class对象。 在...
用户可以输入类名或指定目录,然后自定义ClassLoader将从这些位置加载更新的类。这里可能需要使用到文件I/O操作,以及对.class文件格式的理解。 Java反射是另一个关键概念,它允许程序在运行时检查和修改自身的行为...
在程序运行时,通过自定义的`ClassLoader`,在加载类之前先解密这些加密的字节码,然后再交给JVM执行。这样可以增加逆向工程的难度,防止代码被恶意分析或篡改。加密解密的过程通常涉及到对字节码的操作,例如使用...
在Java编程语言中,`Classloader`(类加载器)是一个至关重要的组件,它负责将类的`.class`文件从磁盘加载到JVM(Java虚拟机)内存中,使得程序能够执行。这篇博文主要围绕`Classloader`的`loadClass`方法进行深入...
- 自定义ClassLoader通常需要重写`loadClass()`方法,该方法在找不到类时调用`findClass()`进行实际的加载操作。 - 在`ClassLoaderDemo`这个例子中,可能就展示了如何创建一个自定义的ClassLoader,从非标准位置...
在Android开发中,自定义ClassLoader是一项关键技能,尤其在实现热修复和插件化技术时。本文主要探讨了Android中自定义ClassLoader导致的性能问题,特别是冷启动速度的影响。问题的核心在于,通过插入自定义的...
在某些特定场景下,比如动态加载代码、插件系统或者安全隔离等,我们需要自定义ClassLoader来实现特定的加载逻辑。例如,我们可能希望加载网络上的类,或者从数据库中读取类的字节码。 以...
自定义 ClassLoader 加载任何类时的类名。 ":myCommand" 命令位于默认 REPL 命令之上。 scala > val hello = " hello " MyClassLoader loads classOf < root>.$line3 <<中略>> MyClassLoader loads classOf ...
在上述代码中,`loadClassData`方法需要根据实际的需求去实现,例如读取指定路径的.class文件内容,或者从网络上下载字节码数据。 在实际开发中,自定义ClassLoader可能涉及到安全问题,因此必须谨慎处理。例如,...
- **编译源代码**:在加载前,自定义ClassLoader会读取源代码并编译成.class文件。 - **加载编译后的类**:编译完成后,ClassLoader将加载编译后的字节码文件到JVM中。 **2. 实现细节** - **源代码读取**:使用...
自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载行为。 理解ClassLoader的工作原理对于排查类冲突、处理依赖关系以及优化大型J2EE应用的性能具有重要意义。开发者可以通过日志输出、...
自定义ClassLoader需要继承`java.lang.ClassLoader`类,并重写`findClass()`或`loadClass()`方法。通过这两个方法,你可以控制类的加载来源和方式。 在实际开发中,理解ClassLoader机制可以帮助解决一些问题,例如...