`
deepnighttwo
  • 浏览: 52157 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javasssist初探(需要对Java的ClassLoader机制有一些了解)

 
阅读更多

Javassist可以用来动态生成java类,就好像js可以生成可执行的js代码一样。javassist是JBoss的一个子项目,用处的话可能是在对EJB提供支持的时候,将声称各种接口的实现类和代理类。

下面给出一个例子,在这个例子中一共有三个类:DirectLoader自定义类加载器;IAccess是接口类(我们动态生成的类要实现这个接口);MainTest完成主要逻辑的类,其中javassist的使用也在这里面体现。下面给出三个类的源代码。需要使用javassist的jar包程序才能运行



//--------------DirectLoader------------------------------------
importjava.security.SecureClassLoader;

publicclassDirectLoaderextendsSecureClassLoader...{
protectedDirectLoader()...{

super(MainTest.class.getClassLoader());
}


protectedClassload(Stringname,byte[]data)...{
returnsuper.defineClass(name,data,0,data.length);
}

}



//--------------IAccess------------------------------------
importjava.util.List;

publicinterfaceIAccess...{
publicvoidCalculate(ListInVars)throwsException;
}



//--------------MainTest------------------------------------

importjava.util.List;

importjavassist.ClassPool;
importjavassist.CtClass;
importjavassist.CtConstructor;
importjavassist.CtMethod;

/**//*
*本类用来演示如何使用javassist动态生成
*/


publicclassMainTest...{
privatestaticfinalCtClass[]NO_ARGS=...{};

//privatestaticfinalCtClass[]INT_ARGS={CtClass.intType};

privatestaticbooleanisFirst=true;

//用这个标示标记是否需要重新生成新的类。
//一般情况下,我们没必要动态生成类,如果有这个必要
//就说明类需要动态改动并使用,所以,这个变量是很有用的
privatestaticbooleanneedReload=true;

privatestaticDirectLoaders_classLoader=newDirectLoader();

publicMainTest()...{
}


publicstaticvoidmain(String[]args)throwsException...{
execTest();
execTest();
}


/***//**
*执行代码
*
*
@throwsException
*/

publicstaticvoidexecTest()throwsException...{
Classclas
=null;
try...{
if(needReload)...{
clas
=createExecClass();
}
else...{
clas
=s_classLoader.loadClass("ExecVar");
}

}
catch(ClassNotFoundExceptione)...{
System.out.println(
"没有这个类,动态生成");
clas
=createExecClass();
}

//使用动态生成的类,最好是使用接口。否则就只能通过反射调用其方法了
IAccessaccess=null;
try...{
access
=(IAccess)clas.newInstance();
}
catch(IllegalAccessExceptionex)...{
ex.printStackTrace(System.err);
System.exit(
1);
}
catch(InstantiationExceptionex)...{
ex.printStackTrace(System.err);
System.exit(
1);
}

List
<String>list=newjava.util.ArrayList<String>();
list.add(
"ThisisaString");
//通过借口的引用调用我们动态生成的类的
access.Calculate(list);
}


privatestaticClasscreateExecClass()throwsException...{
//ClassPool是javasssit中的类,作用嘛,自描述的
ClassPoolpool=ClassPool.getDefault();
CtClassclas
=null;
if(!isFirst)...{
//如果不是第一次,就必须要将原来的类在pool中作废,
//否则无法在同一个pool中生成新的类
//具体做法是否正确,有待进一步考证
pool=ClassPool.getDefault();
clas
=pool.get("ExecVar");
if(clas.isFrozen())...{
System.out
.println(
"ClassExecVarisfrozen,Pleaselookingforsomethingthatcanmakeitunfrozen!");
//clas.defrost();
//从pool中拆离这个类
clas.detach();
}

}

isFirst
=false;

//动态生成一个类
clas=pool.makeClass("ExecVar");
clas.addInterface(pool.get(
"IAccess"));
//增加默认的构造方法
CtConstructorcons=newCtConstructor(NO_ARGS,clas);
cons.setBody(
";");
clas.addConstructor(cons);

//增加一个方法,参数为java.util.List,返回值是空,名字叫做Calculate,所属类是clas
CtMethodmeth=newCtMethod(CtClass.voidType,"Calculate",
newCtClass[]...{pool.get("java.util.List")},clas);
//用这个随机数检测是否是新生成的类
doublerandom=Math.random();
meth.setBody(
"System.out.println("这是一个reload测试:"+$1.get(0)+",随机数:"
+random+"");");
//将方法加入其中
clas.addMethod(meth);
//创建一个新的ClassLoader,以加载新的生成的类,旧的s_classLoader连同旧的
//ExecVar类一起被废弃
s_classLoader=newDirectLoader();
returns_classLoader.load("ExecVar",clas.toBytecode());
}

}




分享到:
评论

相关推荐

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

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

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

    Java ClassLoader定制实例

    在Java编程语言中,...然而,这也需要开发者对Java的内存管理和类加载机制有深入的理解,以便正确且安全地使用。通过研究"InternalsOfClassloadingSrc"这样的项目,我们可以更深入地学习和实践ClassLoader的定制。

    java classloader

    深入Java 2 SDK.pdf`可能涉及的是Java与其他工具和技术的集成,如与微软Office的交互、使用Visual Studio .NET管理Java应用、Ant构建工具的使用以及对Java 2 SDK的深入理解,这些都可能间接地涉及到ClassLoader的...

    java classloader classpath 张孝祥

    本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时类加载机制的理解。 #### 二、ClassLoader详解 ##### 2.1 类加载器的概念 类加载器(`ClassLoader`)是Java运行时环境的一部分,它的主要职责是从...

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

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

    Java ClassLoader原理

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

    Java ClassLoader学习总结

    了解 Java 类加载机制可以帮助我们更好地理解 Java 的运行机制,并且可以帮助我们更好地编写 Java 程序。 知识点总结: * Java 类加载机制是 Java 中一个非常重要的机制,它负责加载 Class 文件到 JVM,以供程序...

    ClassLoader运行机制 自己写的

    理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在...

    Java Classloader机制用法代码解析

    本文将对 Java Classloader 机制进行详细的解析,包括 JDK 默认的 ClassLoader、双亲委托模型、自定义 ClassLoader 等相关内容。 一、JDK 默认的 ClassLoader JDK 提供了多种默认的 ClassLoader,包括 Bootstrp ...

    了解Java ClassLoader

    了解Java ClassLoader不仅有助于理解JVM的运作机制,还能帮助开发者解决一些特定场景下的问题,比如实现模块化的类加载、动态加载代码、隔离不同版本的库等。因此,它是Java程序员必备的知识点之一。

    Understanding the Java ClassLoader

    通过创建自定义的ClassLoader,开发者可以定制JVM的行为,实现对类加载过程的完全控制,从而改变类文件被引入系统的机制。 **2. ClassLoader的作用** - **查找类文件**:当程序请求加载一个类时,ClassLoader负责...

    java classloader讲义-淘宝网

    通过对Java ClassLoader的深入了解,我们可以更好地理解Java类的加载机制以及如何通过自定义ClassLoader来满足特定的应用需求。淘宝网的成功实践为我们提供了宝贵的参考案例,展示了ClassLoaders在实际项目中的重要...

    Java ClassLoader Tutorial.zip

    Java 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责在运行时查找并加载类到JVM中。这个教程将深入探讨ClassLoader的工作原理、类型以及如何自定义类加载器。 一、Java ClassLoader 基础 1. 类...

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    总的来说,"classloader-playground"是一个实践和研究Java类加载机制的实用工具。通过这个项目,开发者不仅可以深入了解Java虚拟机的工作原理,还能掌握如何定制类加载器以满足特定场景的需求,提升系统的灵活性和可...

    JAVA ClassLoader 讲解 (类加载器)

    * 对类文件范式有一定的了解。 #### 三、类加载器结构 类加载器在Java中遵循一个层次化的结构。Java的类加载器体系结构由三个主要类型的类加载器组成: 1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础...

    java的ClassLoader类加载器机制

    Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...

Global site tag (gtag.js) - Google Analytics