• java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)


    当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象

      当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那么我们如何从类对象中获取到他所拥有的属性和方法呢?

      我们利用Class类的几个属性和方法:

    摘自java API:

    在上一篇的基础上创建一个新的类RefTest:

    RefTest.java文件package com.cx.main;

    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    import com.cx.bean.Book;
    public class RefTest {
    //获取类对象的属性getDeclaredFields()
        public void getClassFiled(Object o){
            Class c=o.getClass();
            Field[] fs=c.getDeclaredFields();//获取c类中的所有方法《包括私有方法》/**
             * 在这里需要注意一个方法getFields()与getDeclaredFields()都是获取所有属性,但是前者只能获取public属性
             */
            for (Field f : fs) {
            //获取属性值的时候属性是私有的,不能调用get方法那么就必须获取到操作权限否则就会报错
            f.setAccessible(true);//启用访问
            System.out.println(Modifier.toString(f.getModifiers())
    +"--"+f.getType()+"--"+f.getName()+"--"+f.get(o));//打印出属性修饰符,类型和属性名 } } //获取类对象的方法getDeclaredMethods() public void getClassMethod(Object o){ Class c=o.getClass(); Method[] mt=c.getDeclaredMethods();//获取c类中所有的方法 for (Method m : mt) { System.out.println(Modifier.toString(m.getModifiers())+"--"+m.getReturnType()+"--"+m.getName()); } } //获取方法并且调用它 invoke() 函数 public void useMethod(Object o){ Class c=o.getClass(); try { //获取getName()方法并调用它 Method m=c.getMethod("getName",null); m.invoke(o, new Object[0]); //获取setName方法并且调用它 Method m2=c.getMethod("setName",String.class);//一个参数方法名,一个参数为参数类型 m2.invoke(o, "java编程思想");//o这个对象调用了m2这个方法传递参数为“java编程思想”==o.setName("java编程思想") } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public static void main(String[] args) { Book bo=new Book(); bo.setId(123); bo.setName("java核心技术"); bo.setType("技术"); //获取所有的属性和方法 RefTest rs=new RefTest(); System.out.println("属性:权限修饰符--属性类型--属性名--属性值--"); rs.getClassFiled(bo); System.out.println("方法:权限修饰符--返回值类型--方法名----"); rs.getClassMethod(bo); //获取指定方法并且调用它 rs.useMethod(bo); } }

    这段代码展示了如何从传递的一个对象获取到他所属类的所有属性和和方法。

    这里也就基本展示了反射的本质:

      反射机制:Reflect,指的是程序在运行时能够获取到任何类的内部所有信息<属性,方法>

      反射的功能:只要给出类的全名就可以通过反射获取到类的所有信息

            还可以获取到任何一个类的类对象

            可以获取所有属性对象,并操作它(包括私有属性)

            可以获取到类中,父类中的所有方法并调用

    《《《《《此时反射的这个功能:操作私有属性,从java的特性上来说破坏了java的封装性,

    《《《《《但是私有属性是不是能随意操作的,在操作之前我们需要获取到操作权限

        f.setAccessible(true);//启用f属性的访问

        这个获取权限并不能修改原有属性的权限,只是暂时的获取到可以操作的权限。

    ❤如果这篇文章对你有一点点的帮助请给一份推荐! 谢谢!你们的鼓励是我继续前进的动力。更多内容欢迎访问我的个人博客

    ❤本博客只适用于研究学习为目的,大多为学习笔记,如有错误欢迎指正,如有误导概不负责(本人尽力保证90%的验证和10%的猜想)。

  • 相关阅读:
    SourceForge上发布dedup util 收藏
    IBM快速整合Diligent 触动了谁的神经?
    Data Domain揭开其神秘面纱 加速中国业务发展
    Java NIO原理和使用
    用PDB库调试Python程序
    windows下配置eclipse + Python + PyDev + tornado,并使用pylint进行静态检测
    函数fork与vfork的区别与联系详解
    关于C++中友元类和友元函数的示例讲解
    const成员函数
    pthread_cond_wait()深入解析
  • 原文地址:https://www.cnblogs.com/NextNight/p/4666111.html
Copyright © 2020-2023  润新知