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数组就可以得到里边的构造函数了。

 

posted @ 2016-07-29 12:58  谈笑风生~  阅读(336)  评论(0编辑  收藏  举报