------- android培训、java培训、期待与您交流! ----------
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制,这是本人引用网上的资料,张孝祥老师视频上讲的是将java类的每个部分抽取出来,不过我的个人理解是,给我一个类名,或者类的绝对路径,我可以分析在不看这个类代码的情况下,得出它的内部结构甚至可以重写出来一个一样的类。
所谓java的反射机制,也就是得到一个类的字节码,然后调用相应的方法,将其内部结构一一剥离出来。
首先:我们来看看如何获取其中的构造函数:
Constructor<SuperMan>[] conArrs = (Constructor<SuperMan>[]) SuperMan.class.getDeclaredConstructors();
for (Constructor<SuperMan> constructor : conArrs) {
System.out.println(constructor);
if(constructor.getParameterTypes().length>0){
Class<?>[] paraArr = constructor.getParameterTypes();
System.out.print(constructor+"构造函数的参数类型依次为:");
for (Class<?> cla : paraArr) {
System.out.print(cla+" ");
}
System.out.println();
}
}
输出结果为:
private test.SuperMan(java.lang.String)
private test.SuperMan(java.lang.String)构造函数的参数类型依次为:class java.lang.String
public test.SuperMan()
public test.SuperMan(java.lang.String,java.lang.String,int)
public test.SuperMan(java.lang.String,java.lang.String,int)构造函数的参数类型依次为:class java.lang.String class java.lang.String int
这样我就可以得出这个类有三个构造函数以及每个构造函数的参数,这样我们就可以传入不同的参数来通过newInstance方法来获取对应的实例对象
接着:我们来获取一个类的属性
Field [] fields = SuperMan.class.getDeclaredFields();
Field [] fields = SuperMan.class.getDeclaredFields();
for (Field field : fields) {
System.out.println("属性名: "+field.getName()+" 属性类型 :"+field.getGenericType()+" 访问修饰符:"+field.getModifiers());
}
输出结果为:
属性名: name 属性类型 :class java.lang.String 访问修饰符:1
属性名: sex 属性类型 :class java.lang.String 访问修饰符:2
属性名: age 属性类型 :int 访问修饰符:2
属性名: birthDay 属性类型 :class java.util.Date 访问修饰符:2
其中public,protected,private 的值分别为 1,4,2
通过以上代码,我们就可以获取到这个类的参数属性,及类型,还有访问修饰符。
下面我们再来看看如何获取方法:
Method [] methods = SuperMan.class.getMethods();
for (Method method : methods) {
System.out.println(method);
Class<?>[] classes = method.getParameterTypes();
for (Class<?> class1 : classes) {
System.out.println(class1.getName());
}
}
由于所有类的父类均为Object,所以输出结果包含了Object类的方法。再这里就不写输出结果了。
通过上面的代码,我们可以确定一些问题,那就是反射可以获取到一个类的所有构造函数,属性,方法,参数,及其类型,还有访问修饰符。
也就印证了我的观点,通过反射,可以在不看这个类代码的情况下,获得这个类的内部结构,甚至可以重写它,当然我上面列举的也只是获取一个类型所有的方法,相应的还有很多方法可以去获取,比如根据只获得某个方法,某个参数,某个构造函数等。
在实际开发中,经常也会用到反射,比如老师视频上所讲的,很多的框架也就是在反射的基础上做出来的。这也就说明反射是一个非常实用且好用的技术。