java 反射学习笔记

1.获取class文件对象的三种方式。如果是自己写着玩,任选一种方式,实际开发用第三种。

        //方式1:Object类的getClass()方法
        Person person = new Person();
        Class c1 = person.getClass();
//方式2:数据类型的静态属性class Class c2 = Person.class; //方式3:Class类中的静态方法forName(); Class c3 = Class.forName("com.example.Person");

 2.获取构造方法并使用

        //获取字节码文件对象;
        Class c = Class.forName("com.example.Person");

        //获取所有公共构造方法
        Constructor[] cons1 = c.getConstructors();

        //获取所有构造方法
        Constructor[] cons2 = c.getDeclaredConstructors();

        //获取单个无参构造方法
        Constructor con3 = c.getConstructor();

        //获取单个带参的构造方法
        Constructor con4 = c.getConstructor(int.class, String.class);

        //获取私有构造方法
        Constructor con5 = c.getDeclaredConstructor(String.class);

        //通过无参构造方法创建类的新实例
        Object object1 = con3.newInstance();

        //通过带参的构造方法创建类的新实例
        Object object2 = con4.newInstance(10, "李雷");
        
        //通过私有构造方法创建类的新实例
        con5.setAccessible(true);//值为true则表示反射的对象在使用时应该取消java语言访问检查
        Object object3=con5.newInstance("韩梅梅");

 3.获取成员变量并使用

        //获取字节码文件对象;
        Class c = Class.forName("com.example.Person");

        //获取所有公共成员变量
        Field[] f1 = c.getFields();

        //获取所有成员变量
        Field[] f2 = c.getDeclaredFields();
        for (Field field : f2) {
            System.out.println(field);
        }

        //获取构造方法,创建对象
        Constructor con = c.getConstructor();
        Object obj = con.newInstance();

        //获取单个成员变量并赋值
        Field f3 = c.getField("city");//获取公有成员变量
        Field f4 = c.getDeclaredField("age");//获取成员变量(不管共有私有都能获取)
        f4.setAccessible(true);//取消访问检查
        f3.set(obj, "北京");//对象赋值
        f4.set(obj, 20);

 4.获取成员方法并使用

        //获取字节码文件对象;
        Class c = Class.forName("com.example.Person");

        //获取构造方法,创建对象
        Constructor con = c.getConstructor();
        Object obj = con.newInstance();

        //获取所有成员方法
        Method[] m1 = c.getMethods();//获取自己和父类的所有公共方法
        Method[] m2 = c.getDeclaredMethods();//获取自己的所有方法

        //获取无参单个方法并使用,public void show()
        Method m3 = c.getMethod("show");
        m3.invoke(obj);

        //获取有参有返回值单个方法并使用,public String say(String str)
        Method m4 = c.getMethod("say", String.class);
        Object objStr = m4.invoke(obj, "hello");

        //获取私有单个方法并使用,private void eay()
        Method m5=c.getDeclaredMethod("eay");
        m5.setAccessible(true);//取消访问检查
        m5.invoke(obj);

 

posted @ 2015-10-06 20:43  假装懂Java  阅读(138)  评论(0编辑  收藏  举报