您的位置:首页 > 编程语言 > Java开发

eclipse反射原理及运用

2019-05-28 22:58 281 查看

文章目录

  • 2,运用反射来实例化对象
  • 3,运用反射调用动态方法
  • 4,反射读写属性
  • 二,设置属性值
  • 5,访问修饰符 getModifiers()
  • 什么是反射?

    运用Eclipse官方的一句话:反射是java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法。
    说到实例化对象读写属性,大家都会想到的是运用java语言的封装特点。但大家有没有想过不用封装方法就能调用内部的属性和方法呢?接下来为大家讲解,通过反射也是可以调用的!

    运用

    1,类对象

    什么是类对象?就好比一条狗,他是狗类,他叫狗蛋,那么他就是狗类的对象。要进行反射的第一步,必须先获得类对象的类对象!
    何为类对象的类对象,也就是把所有的类对象集合到一起,看作是一类,称为类对象的类对象。
    获得类对象一般有三种方法,都各有各自的用途

    一,通过对应类(java.lang.Class)实例的类(Student.Class)实例getClss()方法获取 (通用增删改时用到)例:

    Student stu = new Student();
    Class clz = stu.getClass();

    二,通过Class.forName(“类的全路径”); JDBC的驱动加载就用到反射技术。 例:

    Class clz = Class.forName("caom.zking.reflect.Student");

    三,类实例.Class(通用查询用到)例:

    Class clz = Student.class;

    2,运用反射来实例化对象

    通常 运用到反射的好处就是能够将未知的类进行实例化。若找不到所写的类则报ClassNotFoundException错误。
    下面介绍几种情况下如何实例化对象:

    一,通过反射的方式调用无参构造器来实例化对象

    这种方式属于临时的实例化,而且这里他就会自动调用Student这个类的无参构造,可用syso进行输出测试。

    Class clz = Student.class;Student stu = (Student) clz.newInstance();
    

    二,通过反射的方式调用带有参数的构造器来实例化对象

    Class clz = Student.class;//这里的参数指的是你在这个类中写的参数类型,若有多个用逗号隔开
    Constructor c = clz.getConstructor(String.class);
    //这里面的参数和上面相对应,写的是你实例化对象的属性值,若有多个用逗号隔开
    Student stu = (Student) c.newInstance("s001");
    

    三,通过反射的方式调用私有的构造器来实例化对象

    和上面的不同,因为是私有的,通过getConstructor()这个方法是获取不到的。因此,有另外一种方法获取。
    例:

    Constructor c = clz.getDeclaredConstructor(Integer.class);
    //这是设置可以请求,private默认设置的是false
    c.setAccessible(true);
    Student stu = (Student)c.newInstance(12);

    getConstructor 和 getDeclaredConstructor 的区别在于
    getConstructor()可以获取到的是public修饰的。
    getDeclaredConstructor()可以获取到的是所有的构造器。

    3,运用反射调用动态方法

    通过这个方法,可以获取到某类的方法。

    一,无参的

    例:

    Class clz = Student.class;//第一个参数指的是,类类的类实例的类实例
    Method m = clz.getDeclaredMethod("hello");
    //Method类invoke方法的返回值就是被调用的方法的返回值
    //如果被调用的方法不具备返回值,则返回null
    Object invoke = m.invoke(clz.newInstance());
    

    二,有参的

    例:

    Class clz = Student.class;//第二个参数指的是,调用方法所携带的参数,若有多个则用逗号隔开
    Method m = clz.getDeclaredMethod("hello", String.class);
    Object stu = m.invoke(clz.newInstance(), "XXX");
    

    三,私有的

    例:

    Class clz = Student.class;Method m = clz.getDeclaredMethod("add", Integer.class,Integer.class);
    //与其他不同之处在于要设置默认请求开关
    m.setAccessible(true);
    //参数与上文同理
    Object invoke = m.invoke(clz.newInstance(),2,5);
    

    4,反射读写属性

    一,读取属性

    1,获得所有属性

    例:

    Class clz = stu.getClass();
    //获取所有的属性,所有用集合装起来
    Field[] fields = clz.getDeclaredFields();
    //遍历
    for (Field field : fields) {
    //这个是设置私有的属性值能够显示出来,不然会报java.lang.IllegalAccessException 错误
    field.setAccessible(true);
    //field.getName()是获取属性名,field.get(stu)则是获取属性对应的值,参数放的是你要获取参数的对象
    System.out.println(field.getName()+":"+field.get(stu));
    }

    2,获得单个属性

    例:

    Class clz = stu.getClass();
    //参数写的是你要获取的属性值名称
    Field field = clz.getDeclaredField("age");
    System.out.println(field.getName()+":"+field.get(stu));

    二,设置属性值

    1,设置public修饰的(公有)属性

    Student stu = new Student();
    Class clz = stu.getClass();
    
    //同上运用获取单个属性方法
    Field field = clz.getDeclaredField("age");
    //通过set()方法设置值
    field.set(stu, 45);
    System.out.println(stu.age);

    2,设置private修饰的(私有)属性

    Student stu = new Student();
    Class clz = stu.getClass();
    
    //同上运用获取单个属性方法
    Field field = clz.getDeclaredField("sname");
    //与之不同的是多了个设置默认可请求
    field.setAccessible(true);
    field.set(stu,"ccc");
    System.out.println(stu.getSname());

    5,访问修饰符 getModifiers()

    在很多情况下都会想知道此方法或者属性值的修饰符,这就运用到了getModifiers()这个方法了
    getModifiers()返回的 4000 值是二进制数字组成,若只有单个则单个输出。
    例若修饰符只有public那么返回的是1.
    若修饰符只有private那么返回的是2。
    若有组合,例public final …那么就像二进制一样的数字,有兴趣的可以百度了解~

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: