关于java反射的笔记
来源:互联网 发布:c语言compare()函数 编辑:程序博客网 时间:2024/06/06 00:06
类加载器:
从java开发人员角度来看,类加载器包括以下几种:
- 启动(Bootstrap)类加载器:负责将 Java_Home/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。该类加载器由c/c++编写,通过getClassLoader()获取类加载器引用为空值null.
- 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
- 应用程序(Application)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的.它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中.由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统(System)加载器.负责加载用户类路径定义的类库.可以通过Class.getSystemClassLoader()或自己编写的类.getClassLoader()来获取,一般自己没有定义别的类加载器,这个就是默认类加载器.
双亲委派模型:
双亲委派模型的工作过程:类加载器在收到类加载的请求后将请求委托给自己的父加载器(!!!!!非继承,通过getParent()方法获取父加载器),一层一层往上传,直到启动类加载器.当父加载器无法处理该请求时,子加载器才会自己处理这个请求.因为判断两个类是否相等不仅与类自己的定义有关,还与加载该类的类加载器有关,同一个类由不同的类加载器加载,会被判断为不同的类.通过双亲委派模型可以避免这种情况.
public class Test {public static void main(String[] args) {ClassLoader c = Test.class.getClassLoader();while (c != null) {System.out.println(c.getClass().getName());c = c.getParent();}}}这段代码通过getParent()方法迭代获取了类加载器,因为启动类加载器获取为null,所以看不到启动类加载器.
反射就是由用户主动在运行期间动态加载类的一种机制.主要用到了java.lang.Class和java.lang.ClassLoader以及java.lang.reflect.*来实现反射.通过反射可以通过配置文件来动态加载类,还可以破坏类的封装性访问类的私有属性和私有方法.
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Test {public static void main(String[] args) {try {Class c = Thread.currentThread().getContextClassLoader().loadClass("rTest");//Class c = Class.forName("rTest");Object rtest = c.newInstance();Method[] methods = c.getMethods();Field[] fields = c.getFields();for (Method m : methods) {//System.out.println(m);if (m.getName().equals("c")) {m.invoke(rtest, new Object[]{});} if (m.getName().equals("d")) {m.invoke(rtest, new Object[]{3, 4});} }for (Field f : fields) {System.out.println(f.get(rtest));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class rTest{public int a = 0;private int b = 0;public void c() {System.out.println("c");}public void d(int a, int b) {this.a = a;this.b = b;System.out.println(a + b);}private void e() {System.out.println("e");}}
这是一个反射的简单例子,可以通过ClassLoader的loadClass()方法和Class.forName()来加载类.使用Class的getMethods()和getField()方法来获取方法和属性,但是这样不能获取私有的方法和属性,要获取私有的方法和属性,要用getDeclaredMethods()和getDeclaredField()来获取.关于其他的用法可以看api文档.
0 0
- 关于java反射的笔记
- 关于java反射的笔记
- 关于Java的反射
- 我的java学习笔记(12)关于反射(part 1)
- 我的java学习笔记(13)关于反射(part 2)
- 我的java学习笔记(14)关于反射(part 3)
- 关于java反射的总结
- 关于Java反射的理解
- 关于java的反射---1
- 关于Java的反射机制
- 关于Java的反射机制
- java的反射基础笔记
- java的反射机制--关于类中属性的反射。
- 【我的Java笔记】Java反射
- 关于java重的反射的总结。
- 关于java反射的一些理解
- java复习--关于反射的分析
- java中关于类的反射详解
- POJ_3255_Roadblocks【次短路径】
- JAVA字符串格式化-String.format()的使用
- 欢迎使用CSDN-markdown编辑器
- C语言 一元二次方程解的判定及浮点数大小的比较
- Linux ln命令
- 关于java反射的笔记
- DataBinding
- 技术向:一文读懂卷积神经网络
- linear regression(4)-normal equation***compare with gradient descent
- js数组定义的5个迭代方法
- 正则表达式笔记
- POJ NOI MATH-7656 李白的酒
- SharedPreferences+okhttp+gson+picasso实现简单的离线缓存
- Convert BST to Greater Tree
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
大学活动策划书
校园活动策划
国内有奖活动第一分享平台
dir28活动资讯网
成人礼活动策划
商场活动策划
徒步活动方案
高端活动策划
工会活动策划
活动发布平台
员工活动方案
儿童节活动策划
毕业季活动策划
踏青活动方案
植树节活动策划
比赛活动策划
地产活动策划
啤酒节活动策划
读书会活动策划
元旦有什么活动
撕名牌活动策划
婚博会活动策划
商业活动计划书
房地产活动创意
趣味活动策划
文化节活动策划
活动策划哪家好
欢送会活动策划
归宅部活动记录
美容院优惠活动
篮球活动策划
篝火晚会活动
团日活动建议
创意活动方案
大型活动安保
爱心义卖活动
创意开业活动
中秋有什么活动
市场活动策划
美容院促销活动
十周年活动策划