黑马程序员--反射

来源:互联网 发布:网络通,浏览器打不开 编辑:程序博客网 时间:2024/06/05 11:50

反射(理解)

(1)反射:在程序运行时期,是通过class文件对象,去使用构造方法,成员变量,成员方法。

(2)获取class文件对象

1:Object类的getClass()方法

2:数据类型的静态的class属性

3:ClassforName()静态方法

 

推荐:开发使用第三种。

Class类中的方法

        static Class forName(String className)

        返回与给定字符串名的类或接口的相关联的Class对象。

        Class getClass()

        返回的是Object运行时的类,即返回Class对象即字节码对象

        Constructor getConstructor()

        返回Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。

        Field getField(String name)

        返回一个Field对象,它表示此Class对象所代表的类或接口的指定公共成员字段。

        Field[] getFields()

        返回包含某些Field对象的数组,表示所代表类中的成员字段。

        Method getMethod(String name,Class parameterTypes)

        返回一个Method对象,它表示的是此Class对象所代表的类的指定公共成员方法。

        Method[] getMehtods()

        返回一个包含某些Method对象的数组,是所代表的的类中的公共成员方法。

        String getName()

        以String形式返回此Class对象所表示的实体名称。

        String getSuperclass()

        返回此Class所表示的类的超类的名称

        boolean isArray()

        判定此Class对象是否表示一个数组

        boolean isPrimitive()

        判断指定的Class对象是否是一个基本类型。

        T newInstance()

        创建此Class对象所表示的类的一个新实例。


(3)反射的应用

1:通过反射获取构造方法并使用

//获取字节码文件对象

Class c = Class.forName("cn.itcast.Person");

 

//获取构造器对象

Constructor con = c.getDeclearedConstrator(String.class,int.class);

 

//通过构造器对象获取Person对象

Object obj = con.newInstance("刘意",29);

 

2:通过反射获取成员变量并使用

//获取字节码文件对象

Class c = Class.forName("cn.itcast.Person");

 

//获取构造器对象

Constructor con = c.getDeclearedConstrator(String.class,int.class);

 

//通过构造器对象获取Person对象

Object obj = con.newInstance("刘意",29);

 

 

//获取成员变量

Field field = c.getDeclaredField("name");

field.setAccessiable(true);

field.set(obj,"刘大意");

 

 

 

3:通过反射获取成员方法并使用

//获取字节码文件对象

Class c = Class.forName("cn.itcast.Person");

 

//获取构造器对象

Constructor con = c.getDeclearedConstrator(String.class,int.class);

 

//通过构造器对象获取Person对象

Object obj = con.newInstance("刘意",29);

 

//获取所有公共方法对象,包括从父类继承的

//(获取本类所有方法的时候,不包括从父类继承的)

Method[] methods = c.getDeclaredMethods();

for(Method m : methods){

m.setAccessiable(true);

m.invoke(obj, null);

}

 

0 0
原创粉丝点击