JAVA反射
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java
中的反射总结
刚开始学习java的时候真的很难理解反射到底是个什么东西
一些书籍,哪怕是很经典的书籍都解释的让人感觉懵懵的,或许的确是我太笨
况且,网上说在将来学习框架的时候需要经常应用到反射机制,这样一来总让人心里有些不安就方才偶然又把讲解反射的章节和视频看了一点,觉得能理解一些了
现在决定一鼓作气,边看边写,顺便把一些主要的内容和操作都记载到这里
我想,对于我这么一个笨笨的人来说,学习的最好方法也许就是不断重复
遇到不懂的知识就停下来把以往的重新学一遍,虽然浪费了很多时间,但对我也有些效果
我的理解是:所谓反射,就是根据一个已经实例化了的对象来还原类的完整信息
至少对我而言,我认为它带给我的好处是,让我从下往上的又了解了一遍面向对象
x_x 在此又痛恨一边那些厚部头们,把我的脑细胞搞死一片
Class类
如果要完成反射,那么必须了解Class类
实例1:通过对象取得包名和类名
1 2 3 4 5 6 7 8 9
10
11
12
13 package org.siu;
class Test {
}
public class Demo {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.getClass());
System.out.println(t.getClass().getName());
}
}
编译结果如下,注意包的编译方式即可
此处的getClass()方法是默认继承自Object类的
在java中,Object类是所有类的父类,同样,所有类的实例化对象也都是Class类的实例因此,这样一来就会牵扯到向上转型和向下转型的概念
由于向下转型的不安全因素,在这里泛型也会接踵而来
(不过我想说的是,此处的泛型设计很刺眼!尼玛,整个java的语法设计同样刺眼,超恶心!!!)
实例2:Class类的实例化
由于Class类没有构造方法,所以实例化Class类的方式有点特殊,有三种方式:
•对象.getClass( )
•类.Class
•forName( )
其中,forName( )方法需要重点掌握,因为它可以在类不确定的情况下实例化Class,更具灵活性
Class类的应用
Class类中有一个方法叫做newInstance( ),它可以用来创建一个Class类对象的新实例
怎么说呢?Class对象包含的内容就是反射好的那个类,我们要构造那个类的新实例(新对象)
实例3:Class类的无参构造对象
这样就通过无参数的形式构造了一个新的对象,如同正常模式中
通过无参构造方法来构造新对象一样
我们知道,类中除了有无参构造方法,还会存在有参数的构造方法那在反射中如何通过有参数的形式构造对象呢?接着看
实例4:Class类的有参构造对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import ng.reflect.Constructor;
public class Demo {
//下面的几个方法抛出来的异常太多,为了代码的紧凑性,这里就直接抛给虚拟机了
public static void main(String[] args) throws Exception {
Class> c = null;
try {
c = Class.forName("ng.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
char[] ch = {'h','e','l','l','o'};
String s = null;
//获得Class类对象的有参构造方法,括号里面参数的写法是:类型.clas
Constructor> con = c.getConstructor(char[].class);
//用此构造方法构造一个新的字符串对象,参数为一个char数组
s = (String) con.newInstance(ch);
System.out.println("构造的字符串:" + s);
}
}
我们还是使用String类做例,因为String类用的比较多,便于理解
这里需要注意的是,构造方法需要使用getConstructor( )方法获得
至于参数类型则是:原有类型.class
还有一点,无论是有参还是无参,这里所使用的构造方法,原本的类里面必须对应存在
那么,如何才能知道原有类里面的构造方法,普通方法,继承的父类等详细信息呢?接着看
获取类的结构
要通过反射获取类的结构我们这里要导入一个新的包ng.reflect
实例5:取得类的构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import ng.reflect.Constructor;
import java.util.Arrays;
public class Demo {
//下面的几个方法抛出来的异常太多,为了代码的紧凑性,这里就直接抛给虚拟机了
public static void main(String[] args) throws Exception {
Class> c = null;
try {
c = Class.forName("ng.Boolean");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//这里的getConstructors()方法返回的是一个Constructor数组
Constructor>[] cons = c.getConstructors();
//打印的方式你可以自己写,为了方便我用Arrays.toString(),凑合着看
System.out.println(Arrays.toString(cons));
}
}
我选择了Boolean类来做例,因为Boolean类的构造方法就两个,方便看
实例6:取得类所实现的接口