JAVA-Reflect
JAVA-Reflect:
一、什么是反射:
在面向对象的世界里,万事万物皆对象。(普通数据类型不属于对象,但是可以用封装解决这个问题。静态的成员不属于对象,而是属于类的)
类也是对象,类是java.lang.Class类的实例对象。
比如说现在有一个Foo类
1 class Foo{ 2 3 void print(){ 4 System.out.println("foo"); 5 } 6 }
用正常方法表示Foo的对象:
1 Foo foo1 = new Foo();//foo1就表示出来了
我们也可以用反射得到Foo的对象:
Foo这个类也是一个实例对象,Class类的实例对象,如何表示呢
任何一个类都是Class的实例对象,这个实例对象有三种表示方式
1 //第一种表示方式(实际在告诉我们任何一个类都有一个隐含的静态成员变量class) 2 Class c1 = Foo.class; 3 4 //第二中表达方式 已经知道该类的对象通过getClass方法 5 Class c2 = foo1.getClass(); 6 7 8 //第三种表达方式 9 Class c3 = null; 10 try { 11 c3 = Class.forName("xx.xx.xx"); 12 } catch (ClassNotFoundException e) { 13 // TODO Auto-generated catch block 14 e.printStackTrace(); 15 }
然后可以通过类的类类型创建该类的对象实例(通过c1 或 c2 或 c3创建Foo的实例对象)
1 try { 2 Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法 3 foo.print(); 4 } catch (InstantiationException e) { 5 // TODO Auto-generated catch block 6 e.printStackTrace(); 7 } catch (IllegalAccessException e) { 8 // TODO Auto-generated catch block 9 e.printStackTrace(); 10 }
整个这个过程,就称之为反射。
二、通过反射获取类中的信息:
1、通过反射获取类中的方法:
getMethods()方法获取的是所有的public的函数,包括父类继承而来的
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
1 //要获取类的信息 首先要获取类的类类型 2 Class c = obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型 3 //getMethods()方法获取的是所有的public的函数,包括父类继承而来的 4 //getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
5 Method[] ms = c.getMethods();//c.getDeclaredMethods()
然后遍历Method数组就可以得到里边的方法了。
2、通过反射获取类中成员变量的信息:
Field类封装了关于成员变量的操作
getFields()方法获取的是所有的public的成员变量的信息
getDeclaredFields获取的是该类自己声明的成员变量的信息
1 Field[] fs = c.getFields(); 2 Field[] fs = c.getDeclaredFields();
然后遍历Field数组就可以得到里边的成员变量了。
3、通过反射获取构造函数的信息:
构造函数也是对象
java.lang. Constructor中封装了构造函数的信息
getConstructors获取所有的public的构造函数
getDeclaredConstructors得到所有的构造函数
1 Constructor[] cs = c.getConstructors(); 2 Constructor[] cs = c.getDeclaredConstructors();
然后遍历Constructor数组就可以得到里边的构造函数了。