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;

}

 

posted @ 2018-02-08 11:31  彩电  阅读(190)  评论(0编辑  收藏  举报