`

Java Class ClassLoader

    博客分类:
  • java
阅读更多

    下午在看《Java 深度历险》,对Class & ClassLoader的定位不是很clear,于是不小心搜到如下一篇blog:

http://www.cnblogs.com/pony/archive/2008/10/10/1307921.html

   blog_name : Java动态加载类  把代码稍作修改,就能跑起来了。ok,now show code:

共4个class--

package com.mark.core.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Hashtable;

public class MyClassLoader extends ClassLoader {
    // 定义哈希表(Hashtable)类型的变量,用于保存被载入的类数据。
    Hashtable loadedClasses;

    public MyClassLoader() {
        loadedClasses = new Hashtable();
    }

    @Override
    public synchronized Class loadClass(String className, boolean resolve) throws ClassNotFoundException {
        Class newClass;
        byte[] classData;

        // 检查要载入的类数据是否已经被保存在哈希表中。
        newClass = (Class) loadedClasses.get(className);
        // 如果类数据已经存在且resolve值为true,则解析它。
        if (newClass != null) {
            if (resolve) {
                resolveClass(newClass);
            }
            return newClass;
        }

        /*
         * 首 先 试 图 从 本 地 系 统 类 组 中 载 入 指 定 类。 这 是 必 须 的, 因 为 虚 拟 机 将 这 个 类 载 入 后, 在 解 析 和 执 行 它 时 所 用 到 的 任 何 其 他 类,
         * 如java.lang.System 类 等, 均 不 再 使 用 虚 拟 机 的 类 载 入 器, 而 是 调 用 我 们 自 制 的 类 载 入 器 来 加 载。
         */

        try {
            newClass = findSystemClass(className);
            return newClass;
        } catch (ClassNotFoundException e) {
            System.out.println(className + " is not a system class!");
        }

        // 如果不是系统类,则试图从网络中指定的URL地址载入类。
        try {
            // 用自定义方法载入类数据,存放于字节数组classData中。
            classData = getClassData(className);
            // 由字节数组所包含的数据建立一个class类型的对象。
           // newClass = defineClass(classData, 0, classData.length);
            newClass = defineClass(null, classData, 0, classData.length);
            if (newClass == null) {
                throw new ClassNotFoundException(className);
            }
        } catch (Exception e) {
            throw new ClassNotFoundException(className);
        }

        // 如果类被正确载入,则将类数据保存在哈希表中,以备再次使用。
        loadedClasses.put(className, newClass);
        // 如果resolve值为true,则解析类数据。
        if (resolve) {
            resolveClass(newClass);
        }
        return newClass;
    }

    // 这个方法从网络中载入类数据。
    protected byte[] getClassData(String className) throws IOException {
        byte[] data;
        int length;
        try {
            // 从网络中采用URL类的方法载入指定URL地址的类的数据。
            URL url = new URL(className.endsWith(".class") ? className : className + ".class");
            URLConnection connection = url.openConnection();
            InputStream inputStream = connection.getInputStream();
            length = connection.getContentLength();

            data = new byte[length];
            inputStream.read(data);
            inputStream.close();
            return data;
        } catch (Exception e) {
            System.out.println("================start:");
            e.printStackTrace();
            System.out.println("================end:");
            throw new IOException(className);
        }
    }
}

  interface:

 

package com.mark.core.test;

public interface Share {
    public void start(String[] option);
}

 

client test class:

 

package com.mark.core.test;

public class TestClassLoader {
    public static void main(String[] args) {
        MyClassLoader ll = new MyClassLoader();
        Class cc;
        Object oo;
        String ss = "http://localhost:8080/webdemo2/classes/RemoteClass.class";

        if (args.length != 0) {
            ss = args[0];
        }
        try {
            System.out.println("Loading class " + ss + "...");
            // 使用重写的方法loadClass()载入类数据。
            cc = ll.loadClass(ss);
            System.out.println("Creat instance...");
            // 创建Object类型的类实例。
            oo = cc.newInstance();
            System.out.println("Call start() method...");
            // 强制类型转换并执行被载入类中的方法。
            ((Share) oo).start(args);
        } catch (Exception e) {
            System.out.println("Caught exception : " + e);
            e.printStackTrace();
        }
    }
}

 

the file below should be deploy in server after compiler it.

package com.mark.core.test;


public class RemoteClass implements Share {

    /* (non-Javadoc)
     * @see com.mark.core.test.Share#start(java.lang.String[])
     */
    @Override
    public void start(String[] option) {
        System.out.println("congratulations!");
    }

}

 

how to?

step 1: build a java application project [A]. add the code above.

step 2: build a java_server project [B] that it can run on tomcat or other servers.

step 3: in java_server project : then you can  copy RemoteClass.class from project A to project B And don't forget to delete the RemoteClass.java in Project A.

step 4:

   update code.

 

String ss = "http://localhost:8080/webdemo2/classes/RemoteClass.class";

 

 

分享到:
评论

相关推荐

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;

    java中classLoader的使用

    Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...

    Java_ClassLoader详解

    在 Java 语言中,类加载器(ClassLoader)是 Java 运行时环境的核心组成部分之一,它负责将编译后的 `.class` 文件加载到 JVM 中执行。从 JDK 1.0 开始,随着 Java Applet 的出现以及网络应用的需求增加,类加载机制...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    java classloader classpath 张孝祥

    类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...

    java classloader

    Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...

    探究java的ClassLoader及类变量初始化顺序

    自定义ClassLoader是Java灵活性的一个体现,开发者可以通过继承ClassLoader类并重写findClass()方法来自定义类的加载方式,例如从网络、数据库或者特定目录加载类。 接下来,我们讨论类变量初始化的顺序。Java中,...

    测试普通Java程序ClassLoader等级关系的Demo程序

    在Java中,ClassLoader是一个系统组件,它根据指定的全限定类名(包括包名和类名)找到对应的.class文件,并将其转换为运行时的Class对象。Java的类加载机制遵循“双亲委派模型”,这意味着当一个类加载器需要加载类...

    java中ClassLoader

    Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机当中,并将其转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类,因此我们可以根据 Class 的实例可以得到...

    理解Java ClassLoader机制

    自定义ClassLoader需要继承`java.lang.ClassLoader`类,并重写`findClass()`或`loadClass()`方法。通过这两个方法,你可以控制类的加载来源和方式。 在实际开发中,理解ClassLoader机制可以帮助解决一些问题,例如...

    java class加密保护工具

    本工具是对java class文件进行加密保护的工具!本工具全面支持linux/unix/windows操作系统。 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是...

    Java ClassLoader学习总结

    ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。ClassLoader 使用了双亲委托模式进行类加载,每一个自定义的 ClassLoader 都必须继承 ClassLoader 这个抽象类,而每个 ClassLoader ...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java ClassLoader原理

    ### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...

    java class加密保护(完全免费) v2.1

    本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全...

    Understanding the Java ClassLoader

    ### Java ClassLoader理解详解 #### 一、引言 在商业流行的编程语言中,Java以其独特的运行机制脱颖而出:它在Java虚拟机(JVM)上运行。这意味着编译后的程序采用一种特殊的、与平台无关的格式,而不是针对特定...

Global site tag (gtag.js) - Google Analytics