博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
14、反射(reflect)
阅读量:4543 次
发布时间:2019-06-08

本文共 2936 字,大约阅读时间需要 9 分钟。

一、反射概念

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

 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;}

 

转载于:https://www.cnblogs.com/television/p/8430802.html

你可能感兴趣的文章
4_something
查看>>
ACM数论之旅12---康托展开((*゚▽゚*)装甲展开,主推进器启动,倒计时3,2,1......)...
查看>>
使用WebHelper调用Asp.net WebAPI
查看>>
磁盘创建
查看>>
linux发行版
查看>>
如何求解灰度共生矩阵
查看>>
Vue Router的官方示例改造
查看>>
算法第5章上机实践报告
查看>>
css 断行省略号,隐藏,fixed定位
查看>>
scp command
查看>>
git基础(2)
查看>>
Struts2 拦截器的第一次
查看>>
java的局部变量和成员变量以及区别
查看>>
app测试小结20170216
查看>>
41. First Missing Positive
查看>>
Java异常处理
查看>>
php连接数据库 搜索数据形成数组,转为字符串
查看>>
ORACLE——EXTRACT() 截取日期时间的函数使用
查看>>
sgu 102 Coprimes
查看>>
[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
查看>>