???????Java?????
???????????? ???????[ 2015/11/18 11:12:49 ] ??????????????????? ???????
???????
?????? Java ???????????????????????????????????? Java ?????????????????????????????????????????????????????????????????????????????2??????????Щ???????????????ε???????? ???????????????????? osgi ???????????????????????????????????????е??ù?????????????????????????ó????????????????????????????????? Java ??????????????????£???????????????????????????????????????????
?????????????
???????????o???????hotswap?????????????????? Java ???????????£????????? class ?????仯??????????? class ???????Java ??????? Java ????????????????? class ?????? classloader ??????????????? Class ??????????????????????????????????????????????????????????????????????μ?????????滻????? class ?????Java ????????????????????е? class???????????????????????????????????????????? classloader ????????????????????? class ???????£???????? class ???????????????????????????? JVM ?????????????????
?????? ???????????????????? classloader ??????????????? class????????????????????????????????????????????????????????????????????????? Java ????????е??????????????????????????????????????? classloader ???????????????????? classloader ????????????????????????????????????????????????·???? classloader ?????????????????μ?????????????????? classloader ???????????????????????????????????????????????????????????? classloader ???????????????????????????????
????????????????????·???????????????????????????????????? classloader ????????????????????????????????????????μ??????????? class ????????????????δ?????????μ?????????????η?????????????????????????????μ???
?????????????о????????????????
?????????????? classloader????????????????????? class ????????????????????????
?????????????????????????????????????? classloader ????? class??
???????????????????
???????????????????????????????????????????????????????????????? ????????????????????????????????η????仯?????????????????? classloader ??????????????????????????????? classloader ?????????o????????????????С?????????μ?????????????????а汾????? class????????? Test.class ?????????????е????? Test_v1.class???????????????????????????? Test_v2.class????????????м??? class ??????? class ?? defineClass ????????? native ?????????????????ú???????????????????·???????????????????? class ?????
???????? ASM ??? class ???
?????? ??????????????к?????? ASM??CGLIB???????????? ASM????????????? class ????????class ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ASM ?????????? class ????????????????????????????????????????????????????????????Щ????????????????μ? class??
??????????????????? ASM ??????????
?????嵥 1. ???? ASM ????????
????ClassWriter cw = new ClassWriter(ClassWriter.<em>COMPUTE_MAXS</em>);
????ClassReader cr = null;
????String enhancedClassName = classSource.getEnhancedName();
????try {
????cr = new ClassReader(new FileInputStream(
????classSource.getFile()));
????} catch (IOException e) {
????e.printStackTrace();
????return null;
????}
????ClassVisitor cv = new EnhancedModifier(cw??
????className.replace("."?? "/")??
????enhancedClassName.replace("."?? "/"));
????cr.accept(cv?? 0);
????ASM ?????????????????????????????????????????? ClassReader ???????????????? ClassVisitor ??????????????????? ClassWriter ?????????????
????????????????????? class ????????????Щ???????????????????????????????????? 2 ?????衣
??????????????????????????
?????嵥 2. ??????????
????public Class<?> redefineClass(String className){
????ClassWriter cw = new ClassWriter(ClassWriter.<em>COMPUTE_MAXS</em>);
????ClassReader cr = null;
????ClassSource cs = <em>classFiles</em>.get(className);
????if(cs==null){
????return null;
????}
????try {
????cr = new ClassReader(new FileInputStream(cs.getFile()));
????} catch (IOException e) {
????e.printStackTrace();
????return null;
????}
????ClassModifier cm = new ClassModifier(cw);
????cr.accept(cm?? 0);
????byte[] code = cw.toByteArray();
????return defineClass(className?? code?? 0?? code.length);
????}
???????? load ????? class ??????????????????????? ClassModifier?????????????????????????????????????????з??????????????
??????????????????????????????????????????????????е????з????????????????????????£???????????μ??????????????????????????????????????????????? class ???????????????????????????????????????????
?????嵥 3. ?????????????
????// ?? class ???????????????????????
????private Class<?> redefineClass(String className?? ClassSource classSource){
????ClassWriter cw = new ClassWriter(ClassWriter.<em>COMPUTE_MAXS</em>);
????ClassReader cr = null;
????classSource.update();
????String enhancedClassName = classSource.getEnhancedName();
????try {
????cr = new ClassReader(
????new FileInputStream(classSource.getFile()));
????} catch (IOException e) {
????e.printStackTrace();
????return null;
????}
????EnhancedModifier em = new EnhancedModifier(cw?? className.replace("."?? "/")??
????enhancedClassName.replace("."?? "/"));
????ExtendModifier exm = new ExtendModifier(em?? className.replace("."?? "/")??
????enhancedClassName.replace("."?? "/"));
????cr.accept(exm?? 0);
????byte[] code = cw.toByteArray();
????classSource.setByteCopy(code);
????Class<?> clazz = defineClass(enhancedClassName?? code?? 0?? code.length);
????classSource.setClassCopy(clazz);
????return clazz;
????}
??????? load ????? class ??????????????????????????????? EnhancedModifier???????????????????????е???????????????????? ExtendModifier????????????????????????????????????????????????????????????????????????????????
????????? classloader ???????????????????????? class ?????classloader ???????????????????????????Щ class ????????
?????????????????
????Java ????????????????????????????????????????????? new ?????????????????????????????????????????
????????????????????????и??????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????? classloader ??? class???????????????
?????嵥 4. ?滻????????????????
????// ?????
????Greeter p = new Greeter();
????// ????????
????IGreeter p = (IGreeter)MyClassLoader.<em>getInstance</em>().
????findClass("com.example.Greeter").newInstance();
???????????????? ASM ????? class ??????????????? new ?????????滻????? classloader ????????????????????
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11