zoukankan      html  css  js  c++  java
  • 每天学点java_反射

      反射的方法有三种:Class.forName("Reflect.Demo");new Demo().getClass();Demo.class.所有的对象的类都是Class类的一个实例对象.

      反射后的类对象名:clazz(自定义).

      加入了Declared的都是反射的类里面的 比如上面反射Reflect.Demo. Declared就指Demo, 没有Declared的就指实现的接口.或者父类的类Class.

    比如Field[] field = clazz.getDeclaredFields();//获取本类属性

      Field[] filed1 = clazz.getFields();//实现的接口或者父类的属性

      带Modifiers 都是权限修饰符比如public ,private,protect. protect只能同一个包引用:获取权限修饰符名.field 都是指代属性 Type指代类型:String,int等不过会把包名也得到

        

    Class<?> clazz=Class.forName("reflect.MyPerson");
    Field[] field = clazz.getDeclaredFields(); System.out.println(field[0].getName());//获取属性名 for (int i = 0; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); }

    实现反射类的方法

    //调用Person类中的sayChina方法
            Method method;
            try {
                method = clazz.getMethod("sayChina");//调用的方法名sayChina ,
                method.invoke(clazz.newInstance());
                //调用Person的sayHello方法
                method=clazz.getMethod("sayHello", String.class,int.class);//调用的方法名,有参数的话,把参数的类名告诉它,知道调用那个方法
                method.invoke(clazz.newInstance(),"Rollen",20);//new了一个要实例的变量,之后给里面要调用的方法,传入参数
                
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e){
                e.printStackTrace();
            }

    获取反射类的属性,修改反射类的属性

    Field field2=null;
            try {
                Object obj = clazz.newInstance();
                field2=clazz.getDeclaredField("name");//有name-->public, sex--->private
                field2.setAccessible(true);//属性的修饰符为private 不加这句不行, 如果为public,这个就可以不加
                field2.set(obj, "男");//获取obj的实例对象,然后改变obj里面sex的属性的值
                System.out.println(field2.get(obj));
                
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e){
                e.printStackTrace();
            }
  • 相关阅读:
    072孤荷凌寒从零开始学区块链第72天DAPP027
    014自学方法论_养成随手记录自学过程遇到问题的好习惯
    015把注意力放在养大我们金鹅身上
    071孤荷凌寒从零开始学区块链第71天DAPP026
    070孤荷凌寒从零开始学区块链第70天DAPP024
    068孤荷凌寒从零开始学区块链第68天DAPP022
    014什么才是一个人最宝贵的资产
    013自学方法论_怎样才是最高效率加强记忆的自学
    012自学方法谈_不要依赖视频,培养自己的阅读理解能力
    013学会建立一个个自动化的管道
  • 原文地址:https://www.cnblogs.com/JohnChen-happy/p/4710927.html
Copyright © 2011-2022 走看看