Java中的反射的简明使用

1.   反射

    发射的概述:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个              方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

    反射的作用:可以再运行时期动态的创建对象:获取对象的属性和方法,不需要源码。

    反射的使用

      a.获取class对象

          方法一:Object.getClass();

        方法二:没中数据类型都有一个“静态”的class属性int.class

        方法三:通过Class类的静态方法:Class clazz=Class.forName(String className)

        注:className=类的全名(即报名+类名例:gz.demo1)

      b.通过class对象可以获取某个类的:构造方法,成员变量,成员方法;并访问成员

    反射的使用实例

* api的解释:

* -----|Class Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
* --------|Class.forName("gz.fanshe.entity.Student") 用于创建Class的实例
* --------|clazz.getConstructor(String.class,String.class);用于获取构造器
* --------|constructor.newInstance("1","乔布斯") 用于通过构造器,创建实体类对象
* --------|clazz.getDeclaredFields();//获取所用对象(共有的,私有的,受保护的)
* --------|field.setAccessible(true);//接触所用限制,强制访问
* --------|Method m = clazz.getDeclaredMethod("setId", String.class);//获取方法
* ----------|m.invoke(stu1, "2");//调用stu1的setId()方法
* 使用步骤:
* 1.创建并获取class对象
* 2.获取构造方法,并调用

public class Demo1 {
    public static void main(String[] args)throws Exception {
        //1.创建并获取class对象
            Class clazz=Class.forName("gz.fanshe.entity.Student");
            //2.获取构造方法
            Student stu1=(Student) clazz.newInstance();//默认调用无参的构造方法
            Constructor constructor = clazz.getConstructor(String.class,String.class);//获取构造器
            Student stu2=(Student) constructor.newInstance("1","乔布斯");
            //3.获取成员变量并调用
            Field[] fieldArray=clazz.getDeclaredFields();//获取所用对象(共有的,私有的,受保护的)
            for (Field field : fieldArray) {
                field.setAccessible(true);//接触所用限制,强制访问
                //获取字段名称
                String name=field.getName();
                //获取值
                Object value=field.get(stu2);
                System.out.println(name+value);
            }
            //4.获取成员方法并调用
            Method m = clazz.getDeclaredMethod("setId", String.class);//获取方法
            m.invoke(stu1, "2");//调用set方法
            Method m2 = clazz.getMethod("getId");
            System.out.println(m2.invoke(stu1));//调用get方法                        
    }
}

 



posted @ 2018-08-04 14:01  SteveGuo  阅读(187)  评论(0编辑  收藏  举报