A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心之谷96 中级黑马   /  2015-8-29 21:38  /  263 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


* 反射:
* 定义:
* java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;
* 对于任意一个对象,都能够调用它的任意一个方法和属性;
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
*
* 想要解剖一个类,必须先要获取到该类的字节码文件。而解剖使用的就是Class类中的方法,
* 所以先要获取到每一个字节码文件对应的Class类型的对象。
*
* 简单的说,反射就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
* Class类:
*                 成员变量:        Field
*                 构造方法:        Constructor
*                 成员方法:        Method
*
* 一、获取Class文件对象的三种方式:
* 1、Object类的getClass()方法
*                 Person p = new Person();
*                 Class c = p.getClass();
*
* 2、数据类型的静态属性class
*                 Class c = Person.class;
*
* 3、Class类中的静态方法
*                 Class c = Class.forName("Person");
*
* 开发中常用的获取方式是第三种,因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把
* 字符串配置到配置文件中。
*
* 二、通过反射获取构造方法并使用
*
*
*
*
*
* */

import java.lang.reflect.*;


public class Reflect {

        public static void main(String[] args)throws Exception {
                // TODO Auto-generated method stub
                //获取字节码文件对象
                Class c = Class.forName("com.itheima_01.Person");
               
                //获取构造方法
                Constructor[] cons1 = c.getConstructors(); //获取所有公共构造方法
                Constructor[] cons2 = c.getDeclaredConstructors(); //获取所有构造方法
               
                //1、获取单个无参构造方法
                Constructor con1 = c.getConstructor();  //返回的是工作方法对象
                //使用Constructor对象表示的构造方法来创建该构造方法的声明类的新实例。
                Object obj1 = con1.newInstance();
                               
                //2、获取带参构造方法对象
                Constructor con2 = c.getConstructor(String.class,int.class,String.class);
                //通过带参构造方法创建对象
                Object obj2 = con2.newInstance("张三",17,"北京");
               
                //3、获取私有构造方法并使用
                Constructor con3 = c.getDeclaredConstructor(String.class);
                //值为true则反射的对象在使用时会取消java语言访问检查
                con3.setAccessible(true);
                Object obj = con3.newInstance("张三");
                               
        }
}


/*
* 通过反射获取成员变量并使用
* 获取所有成员:getFields     getDeclaredFields
* 获取单个成员:getField      getDeclaredField
* 修改成员的值: set(Object obj,Object value) 将指定对象变量上此Field对象表示的字段设置为指定的新值。
*
* */


public class Reflect2 {

        public static void main(String[] args)throws Exception {
                // TODO Auto-generated method stub
                //获取字节码文件对象
                Class c = Class.forName("com.itheima_01.Person");
               
                //获取所有的成员变量
                Field[] fields1 = c.getFields();
                Field[] fields2 = c.getDeclaredFields();
               
                //通过无参构造方法创建对象
                Constructor con = c.getConstructor();
                Object obj = con.newInstance();
               
                //1、获取单个的成员变量
                Field addressField = c.getField("address");
                addressField.set(obj,"北京"); //将指定对象变量上Field对象表示的字段设置为指定的新值
               
                //2、获取name并对其赋值
                Field nameField = c.getField("name");
                nameField.setAccessible(true);
                nameField.set(obj, "张三");
               
                //3、获取age并对其赋值
                Field ageField = c.getField("age");
                ageField.setAccessible(true);
                ageField.set(obj,"27");               
                               
        }
}


/*
* 通过反射获取成员方法并使用
* 获取所有方法:getMethods     getDeclaredMethods
* 获取单个方法:getMethod      getDeclaredMethod
* 暴力访问:method.setAccessible(true)
*
* */
public class Reflect3 {

        public static void main(String[] args)throws Exception {
                // TODO Auto-generated method stub
                //获取字节码文件对象
                Class c = Class.forName("com.itheima_01.Person");
               
                //获取所有方法
                Method[] methods1 = c.getMethods(); //获取自己的包括父类的公共方法
                Method[] methods2 = c.getDeclaredMethods(); //获取自己的所有方法
               
                Constructor con = c.getConstructor();
                Object obj = con.newInstance();
               
                //1、获取单个的方法并使用
                Method m1 = c.getMethod("show");  //参数表示方法名
                m1.invoke(obj); //调用obj对象的m1方法
               
                //2、带参数的方法调用
                Method m2 = c.getMethod("method", String.class);
                m2.invoke(obj, "nihao");
               
                //3、带参数并且有返回值的方法调用
                Method m3 = c.getMethod("getString", String.class,int.class);
                Object objString = m3.invoke(obj, "nihao",100);
               
                //4、私有方法的访问
                Method m4 = c.getDeclaredMethod("function");
                m4.setAccessible(true);
                m4.invoke(obj);
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马