java反射机制总结
2016-01-01 19:57
716 查看
【0】README
0.1)以下内容转自: http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html0.2)for source code, please visit (1~14 source code : https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionCluster.java)
1)通过一个对象获得完整的包名和类名(添加一句:所有类的对象其实都是Class的实例)
2)实例化Class类对象
3)通过Class实例化其他类的对象(通过无参构造实例化对象)
4)调用有参构造器构造类的实例
5)返回一个类实现的接口 + 继承的父类
6)获得其他类中的全部构造函数
7)获取类中所有方法(包括方法参数列表,修饰符,所抛出异常,返回值)
8)取得其他类的全部属性,最后将这些整理在一起,也就是通过class取得一个类的全部框架
9)通过反射调用其他类中的方法
10)调用其他类的set和get方法(修改器setter 和 访问器getter)
11)通过反射操作属性
12)通过反射取得并修改数组的信息
13)通过反射修改数组大小
14)动态代理
14.1)如何获得类加载器
14.2)其实在java中有三种类类加载器
1)Bootstrap ClassLoader: 此加载器采用c++编写,一般开发中很少见;
2)Extension ClassLoader: 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类;
3)AppClassLoader: 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器;
4)如果想要完成动态代理,首先需要定义一个InvocationHandler接口的子类,以完成代理的具体操作;(干货——动态代理不太熟悉,仅供了解吧)
//定义项目接口 interface Subject { public String say(String name, int age); } // 定义真实项目 class RealSubject implements Subject { @Override public String say(String name, int age) { return name + " " + age; } } class MyInvocationHandler implements InvocationHandler { private Object obj = null; public Object bind(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object temp = method.invoke(this.obj, args); return temp; } } class hello { public static void main(String[] args) { MyInvocationHandler demo = new MyInvocationHandler(); Subject sub = (Subject) demo.bind(new RealSubject()); String info = sub.say("Rollen", 20); System.out.println(info); } }
14.3)类的生命周期(在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成)
14.3.1)类的装载: 是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类装载器装载以前;
14.3.2)类的链接:就是把二进制数据组装为可以运行的状态;
14.3.2.0)链接分为校验,准备,解析这3个阶段
14.3.2.1)校验:一般用来确认此二进制文件是否适合当前的JVM(版本);
14.3.2.2)准备:就是为静态成员分配内存空间。并设置默认值;
14.3.2.3)解析:指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系);
14.3.3)类初始化: 完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间;
14.3.4)结束生命周期:当没有任何引用指向Class对象时就会被卸载,结束类的生命周期;
15) 将反射用于工厂模式
15.1)不用反射的工厂模式:
(https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactory.java)
对以上代码的分析(Analysis): 这样,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
15.2)用反射的工厂模式:
(https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactoryWithReflection.java)
15.3)通过属性文件的形式配置所需要的子类: 上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类:
下面我们来看看: 结合属性文件的工厂模式
(https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactoryProperties.java)
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树