关于网站开发的参考文献有哪些,建设银行办信用卡网站首页,网站的宣传推广方式,小程序首页模板【版权声明】未经博主同意#xff0c;谢绝转载#xff01;#xff08;请尊重原创#xff0c;博主保留追究权#xff09; https://blog.csdn.net/m0_69908381/article/details/139726506 出自【进步*于辰的博客】 参考笔记三#xff0c;P53.1。 1、介绍
大家可能没注意过… 【版权声明】未经博主同意谢绝转载请尊重原创博主保留追究权 https://blog.csdn.net/m0_69908381/article/details/139726506 出自【进步*于辰的博客】 参考笔记三P53.1。 1、介绍
大家可能没注意过此注解我从JDK源码中摘取一段
CallerSensitive
public ConstructorT getDeclaredConstructor(Class?... parameterTypes)throws NoSuchMethodException, SecurityException {checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);return getConstructor0(parameterTypes, Member.DECLARED);
}老熟人吧大家看Reflection.getCallerClass()这个方法它有什么用我写个示例
class C {public static void main(String[] args) {sout getCallerClass();// class C}CallerSensitivepublic static Class? getCallerClass() {return Reflection.getCallerClass();}
}很显然这个方法返回调用方调用类的 Class 对象。PS这个功能在很多时候是用处很大的
那这其中有什么门道CallerSensitive注解是干什么的 启发博文《CallerSensitive 注解的作用》转发。 那位博主已详细说明我简单总结一下 JVM认为有些方法敏感或危险如Reflection.getCallerClass()要求调用方法必须使用CallerSensitive注解注解且调用方法所属类必须由启动类加载器加载才能识别此注解。 众所周知我们自定义的类的类加载器默认是 AppClassLoader应用程序类加载器而不是 BootStrapClassLoader启动类加载器。
因此我们可以通过配置VM Options“假装”类是启动类令启动类加载器去加载它便可识别此注解。
2、三种 VM Options
配置命令有三种
1-Xbootclasspath:path。
表示令JVM从path加载类用于替换rt.jar。
大家可能没注意过rt.jar这个jar包它里面存放的就是我们平日经常使用的类如String、Class。当然具体来说存放的是class字节码文件。
rt.jar是由启动类加载器加载的使用此命令的确可以达成目标“假装”是启动类但我们不用尝试便可知道使用此命令JVM一般无法运行。
2-Xbootclasspath/a:path。
表示令JVM将path添加进默认的 Bootstrap 路径sun.boot.class.path中也就是让JVM在加载完rt.jar后加载path中的类。
下面我打印一下sun.boot.class.path参数中的路径
E:\compile\jdk\java\jdk1.8.371\jre\lib\resources.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\rt.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jsse.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jce.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\charsets.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jfr.jar
E:\compile\jdk\java\jdk1.8.371\jre\classes再配置命令-Xbootclasspath/a:G:\projects-local\java\workspace\target\classes打印结果
E:\compile\jdk\java\jdk1.8.371\jre\lib\resources.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\rt.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jsse.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jce.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\charsets.jar
E:\compile\jdk\java\jdk1.8.371\jre\lib\jfr.jar
E:\compile\jdk\java\jdk1.8.371\jre\classes
G:\projects-local\java\workspace\target\classes看最后一条。
3-Xbootclasspath/p:path。
表示令JVM优先 Bootstrap 路径加载path。这条命令一般用得少
最后再补充两点
1path需是编译文件.class的存放路径且是绝对路径故是.../classes而不是具体 class 字节码文件。
2上文说过自定义类的类加载器默认是 AppClassLoader。我们测试一下
C.class.getClassLoader();// sun.misc.Launcher$AppClassLoader18b4aac2配置 VM Options 后根据上文所述此时打印结果应该是xxx.BootstrapClassLoadder可实际上是null。
PS我暂不知其缘由猜测可能是Java本身就是这样设计的就如 BootstrapClassLoader 不是 ExtClassLoader 的父类加载器一般。
最后
这个注解涉及了类加载方面的知识点如果你有意向学习推荐一篇博文《一看你就懂超详细java中的ClassLoader详解》转发这也是我系统学习ClassLoader类参考的文章。
如果你对ClassLoader的源码有兴趣我写了一篇源码解析博文《Java-API简析_java.lang.ClassLoader类基于 Latest JDK浅析源码》相信对你有帮助。
本文完结。