zoukankan      html  css  js  c++  java
  • 反射

    1)定义:就是把JAVA类中的各种成分映射成一个个的java对象。
                             利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
            2)外存中的类加载到内存中,会形成该对象的Class类。如:String.class、Person.class
                    得到此class类的三种方式:
                        1》类.class
                        2》对象.getClass()
                        3》类.forName(String className) //className:包含包的类名
                        eg:
                            String str = "str";
                            Class c1 = String.class;
                            Class c2 = str.getClass();
                    
                            Class c3 = Class.forName("java.lang.String");
                
            3)使用不同的方式得到的.class对象在相同的内存空间。
            4)取得构造函数的对象的两种方法:
                1》通过getConstructor(Class... parameterTypes)方法
                        此方法不能获取private的构造函数对象。
                        eg:
                            Constructor con = clazz.getConstructor(null);//null为构造函数的参数,没有就写null
                            
                            Constructor con = clazz.getConstructor(String.class, int.class);
                            Person p = (Person) con.newInstance("berry", 10);
                2》通过getDeclaredConstructor(Class... parameterTypes)和setAccessible(boolean b)方法:
                        此方法也不能取得public的构造函数对象,但可以在后面通过setAccessible(true)方法设置
                        eg:
                            Constructor con = clazz.getDeclaredConstructor(null);
                            
                            //设置非public成员的访问性,默认false不能访问
                            con.setAccessible(true);
                            Person p = (Person) con.newInstance(null);
            5)取得字段对象
                1》通过Class对象的getField("字段名字");或者getDeclaredField("字段名称")获取字段对象
                2》通过Field对象的set(对象名, "此对象的字段值");设置字段值
                    eg:
                        Field f = clazz.getDeclaredField("name");
                        f.setAccessible(true);
                        
                        Person p = new Person();
                        f.set(p, "杰克");//相当于:p.setName("杰克")
                        System.out.println("用户名:"+p.getName());//用户名:杰克
         6)获取方法对象
                 1》通过getMethod("方法名",Class... parameterTypes);
                         或者
                         getDeclaredMethod("方法名" , Class... paramterTypes);
                         获取Method对象。
                 2》通过invoke(Object obj, Object... args)方法调用此方法
                     【静态函数,对象引用可以为null;
                         没有参数,形参值为null】
                    eg1:
                        Method m = clazz.getMethod("show", String[].class, double.class);    
                        m.invoke(p, new String[]{"sing", "dance"}, 5000);
                3》获得函数返回值:
                         invoke(Object obj, Object... args)的返回值就是函数对象的返回值
                             
         7)获取main函数对象【特例】
                 !注意:在反射main方法时,编译器会将数组自动拆分,取第一个值
                 
                     Method m = c.getMethod("main", String[].class);
                    //静态方法不需要对象
                    //m.invoke(null, new String[]{"A", "B", "C"});//抛出异常:要求传入的是一个数组对象,而其传入的是一个字符串"A".
                    
                    //解决办法一:将数组强制转换成一个对象
                    m.invoke(null, (Object)new String[]{"A", "B", "C"});
                    //解决办法二:将错就错,在数组中的嵌套一个数组。
                    m.invoke(null, new Object[]{new String[]{"A", "B", "C"}});
            总结:
                /*获得私有的构造函数对象:
                        通过getConstructor会出现异常:java.lang.NoSuchMethodException: cn.itcast.java.reflect.Person.<init>()
                        通过getDeclaredConstructor也会出现异常:java.lang.IllegalAccessException: Class cn.itcast.java.reflect.Demo4 can not access a member of class cn.itcast.java.reflect.Person with modifiers "private"
                */
                            
            
  • 相关阅读:
    C# using
    Spring框架
    is
    pycharm破解197
    python安装197
    python3.7.0安装197
    centos7 minimal 安装mysql197
    centos7 minimal 安装 &网络配置197
    ruby安装卸载197
    redis安装 卸载 启动 关闭197
  • 原文地址:https://www.cnblogs.com/SkyGood/p/3953430.html
Copyright © 2011-2022 走看看