Java基础之反射

1.反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性

2.获取Class对象的几种方式
1.Class.forName(“全类名”):将字节码文件加载进来,返回Class对象
2.类名.class:通过类名的属性class获取
3.对象.getClass 通过Object类定义的方法获取

		Person p = new Person();//创建Person类的对象
        Class clazz1 = Class.forName("com.xunrui.bean.Person");// Class.forName("全类名")
        Class clazz2 = Person.class;//类名获取
        Class clazz3 = p.getClass();//对象获取

3.获取成员属性的方法

        Field[] fields = clazz1.getFields();  //获取所有公共成员变量
        for(Object o :fields){   //通过遍历获取成员变量
            System.out.println(o);
        }
        Field name1 = clazz1.getField("a"); //通过成员变量的名字 获取成员变量对象
        name1.set(p,"张三");   //操作成员变量a
        Object o1 = name1.get(p);
        System.out.println(o1);

      <!-------------非公有的成员变量获取方式--------------->
        Field[] fieldss = clazz1.getDeclaredFields(); //获取所有的成员变量(包含私有的)
        for(Object o :fieldss){
            System.out.println(o);
        }
        Field name2 = clazz1.getDeclaredField("name");
        name2.setAccessible(true); //由于Private String name; 是非public的 故而需要暴力反射 去掉私有权限
        name2.set(p,"私有权限的张三");   //操作成员变量a
        Object o2 = name2.get(p);
        System.out.println(o2);

4.获取对象的过程

 		//对象的获取过程
        Constructor[] constructors = clazz1.getConstructors();
        for (Object o:constructors) {
            System.out.println(o);
            //public com.xunrui.bean.Person()
            //public com.xunrui.bean.Person(java.lang.String,int)
        }

        //创建有参非私有的构造函数
        Constructor constructor = clazz1.getConstructor(String.class,int.class);//获取构造函数
        Person person = (Person) constructor.newInstance("张三",23);
        //Person person1 = (Person) clazz1.newInstance(); //使用构造函数创建无参对象
        System.out.println(person);

        //私有的构造获取
        Constructor[] declaredConstructors = clazz1.getDeclaredConstructors();
        for (Object o:declaredConstructors) {
            System.out.println(o);
        }
        //创建有参非私有的构造函数
        Constructor declaredConstructor = clazz1.getDeclaredConstructor(String.class, int.class);
        declaredConstructor.setAccessible(true);//去除私有
        Person person1 = (Person) declaredConstructor.newInstance("李四",24);
        System.out.println(person1);

5.获取方法的过程

      
        Method[] methods = clazz1.getMethods();  //获取所有的public的方法
        // Method[] declaredMethods = clazz1.getDeclaredMethods(); 获取包含私有方法的方法数组
        for (Object o : methods) {
            System.out.println(o);
         /*
        *public java.lang.String com.xunrui.bean.Person.toString()
        public java.lang.String com.xunrui.bean.Person.getName()
        public void com.xunrui.bean.Person.setName(java.lang.String)
        public void com.xunrui.bean.Person.eat(java.lang.String)
        public void com.xunrui.bean.Person.setAge(int)
        public int com.xunrui.bean.Person.getAge()
        public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
        public final void java.lang.Object.wait() throws java.lang.InterruptedException
        public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
        public boolean java.lang.Object.equals(java.lang.Object)
        public native int java.lang.Object.hashCode()
        public final native java.lang.Class java.lang.Object.getClass()
        public final native void java.lang.Object.notify()
        public final native void java.lang.Object.notifyAll()
         */
        }

        Method method = clazz1.getMethod("eat", String.class);//获取指定方法
        //Method method1 = clazz1.getDeclaredMethod("eat", String.class);//获取private的方法
        //method1.setAccessible(true);//去除私有 暴力反射
        method.invoke(person, "饭");//执行方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值