• 14、反射(reflect)


    一、反射概念

     不用实例化也可以调用类中的私有成员;反射慢,实例化快;反射可以看到其他类中的内部构造,透明,但是不安全。

     JAR:JAVA函数库

     WAR:web发布的包

     YAR:RPC服务

    二、idea打jar

      首先将需要当jar包的类全都public,然后点击右上角的图标,在Artifacts栏中选中一个主类方法,同意所添加的项目,ok。

      然后点击菜单栏中的Build下的build project,将jar包加入obj目录下。

      在自己的项目下新建包lib,将刚才加入到obj中的jar包复制到lib中,然后再次点击第一步中的图标,在libraries中选择刚才这个jar,添加即可。

    三、反射具体操作

      1、将所需要创建的类都打包称为jar

      2、在方法中写入如下类似代码(c为运行时类)类——>运行时类——>对象(默认构造器反射)

     private static void reflectConstructor() {
            //类  运行时类 对象
                try {
                    Class c = Class.forName("com.zxc.N1.Animal");
                    Object o = c.newInstance();
                    Animal a = (Animal) o;
                    a.setName("Dog");
                    System.out.println(a.getName());
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }

      3、非默认构造器反射:参数列表中的三个点表示未知参数个数

    private static void reflectNDConstructor(){
            try {
                Class c=Class.forName("com.zxc.N1.Animal");
                Constructor c1=c.getConstructor(int.class,String.class);
                Object o=c1.newInstance(12,"Cat");
                Animal a=(Animal)o;
                System.out.println(a.getName());
            } catch(Exception e){
                e.printStackTrace();
            }
        }

      4、方法反射:

    private static void reflectMethod(){//反射方法
            try{
                Class c=Class.forName("com.zxc.N1.Animal");
                Constructor c1=c.getConstructor(int.class,String.class);
                Object o=c1.newInstance(10,"Snake");
                Method m=c.getMethod("setName",String.class);
                m.invoke(o,"Wolf");
                Method m1=c.getMethod("getName");
                System.out.println(m1.invoke(o));
    
    //            Method ms[]=c.getMethods();
    //            for(Method e:ms){
    //                System.out.println(e.getName());
    //            }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

      5、属性反射:

      

     private static void reflectAttribute() {//反射属性
            try{
                Class c=Class.forName("com.zxc.N1.Animal");
                Object o=c.newInstance();
    
                Field age=c.getDeclaredField("age");
              //  age.set(o,12);私有不可访问
                age.setAccessible(true);
                age.set(o,100);
                System.out.println(age.get(o));
                // Field []f=c.getFields();  私有属性看不到
    //            Field []f=c.getDeclaredFields();//可以看到私有属性
    //            for(Field f1:f){
    //                System.out.println(f1.getName());
    //            }
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    6、数组反射

      

     private static void reflectArray(){
            Object o=Array.newInstance(String.class,3);
            Array.set(o,0,"A");
            System.out.println(Array.get(o,0));
        }
    通过反射来扩展一个数组:

    public Object growArray(Object array, int size) {
    
        Class type = array.getClass().getComponentType();
    
        Object grown = Array.newInstance(type, size);
    
        System.arraycopy(array, 0, grown, 0,
    
            Math.min(Array.getLength(array), size));
    
        return grown;
    
    }
  • 相关阅读:
    centos7 Nginx1.14+php7+mysql5.7 以及 centos7 Apache2.4+PHP7+mysql 安装 Linux 配置 composer 以及Python2.7升级到3.7
    微信遇到的几个小问题
    前段mui框架初识
    关于百度编辑器设置默认行间距段间距
    call与apply 以及闭包
    随笔日记2018 4.10 关于多选框
    关于JVM中的两个Survivor区
    (转)Struts2的工作原理
    (转)struts2的执行流程、工作原理
    (转)最大乘积分析(切绳子)
  • 原文地址:https://www.cnblogs.com/television/p/8430802.html
Copyright © 2020-2023  润新知