Java 反射机制的理解

一直以来感觉“java反射机制”是个很神秘,至少是我一时半会搞不懂的东西。。。

首先什么是java反射?

      java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

      下面我就通过例子来把我了解的java反射里的应用给罗列出来。。

Java代码 复制代码  收藏代码java反射机制的理解
  1.   
  2.            
  3.           
  4.         Class cla Provider.class;   
  5.            
  6.         Class cla_s null;   
  7.         try {   
  8.             cla_s Class.forName("com.pac.Provider");//静态方式获取   
  9.         catch (ClassNotFoundException e) {   
  10.             // TODO Auto-generated catch block   
  11.             e.printStackTrace();   
  12.         }   
  13.            
  14.         System.out.println(cla.getPackage().getName());//获取Provider的包路径名称   
  15.         System.out.println(cla.getSuperclass().getName());//获取Provider的父类名称   
  16.         Class[] interfaces cla.getInterfaces();   
  17.         for(Object o:interfaces){   
  18.             Class is =(Class)o;   
  19.             System.out.println(is.getName());//获取Provider的所有实现的接口的名称   
  20.         }   
  21.                
  22.            
  23.         Field[] fid cla.getDeclaredFields();//获取Provider自身定义的属性名称,不论 public 或private 或其它类型皆可获得   
  24.         for(Object o:fid){   
  25.             Field fd (Field)o;   
  26.             System.out.println(fd.getName());   
  27.         }   
  28.            
  29.         Field[] fid_1 cla.getFields();//获取Provider及父类定义的属性名称,只能获得public类型的属性   
  30.         for(Object o:fid_1){   
  31.             Field fd (Field)o;   
  32.             System.out.println(fd.getName());   
  33.         }   
  34.            
  35.         Method[] med cla.getDeclaredMethods();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得   
  36.         for(Object o:med){   
  37.             Method fd (Method)o;   
  38.             System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()");   
  39.         }   
  40.            
  41.         Method[] med_d cla.getMethods();//得到Provider及其父类以及父类的父类(以此类推)的所有的public方法,当然子类重写父类的方法的情况下只显示一次。   
  42.         for(Object o:med_d){   
  43.             Method fd (Method)o;   
  44.             System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()");   
  45.         }   
  46.            
  47.         Constructor[] con cla.getDeclaredConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得   
  48.         for(Object o:con){   
  49.             Constructor fd (Constructor)o;   
  50.             TypeVariable[] tv fd.getTypeParameters();   
  51.             String para "";   
  52.             for(Object otv:tv){   
  53.                 TypeVariable (TypeVariable)otv;   
  54.                 para += v.getName()+",";   
  55.             }   
  56.             para para.length()==0?"":para.substring(0, para.length()-1);   
  57.             System.out.println("Constructor:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")");   
  58.         }   
  59.            
  60.         Constructor[] con_c cla.getConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得   
  61.         for(Object o:con_c){   
  62.             Constructor fd (Constructor)o;   
  63.             TypeVariable[] tv fd.getTypeParameters();   
  64.             String para "";   
  65.             for(Object otv:tv){   
  66.                 TypeVariable (TypeVariable)otv;   
  67.                 para += v.getName()+",";   
  68.             }   
  69.             para para.length()==0?"":para.substring(0, para.length()-1);   
  70.             System.out.println("getConstructors:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")");   
  71.          
 Class cla = Provider.class; Class cla_s = null; try { cla_s = Class.forName("com.pac.Provider");//静态方式获取 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(cla.getPackage().getName());//获取Provider的包路径名称 System.out.println(cla.getSuperclass().getName());//获取Provider的父类名称 Class[] interfaces = cla.getInterfaces(); for(Object o:interfaces){ Class is =(Class)o; System.out.println(is.getName());//获取Provider的所有实现的接口的名称 } Field[] fid = cla.getDeclaredFields();//获取Provider自身定义的属性名称,不论 public 或private 或其它类型皆可获得 for(Object o:fid){ Field fd = (Field)o; System.out.println(fd.getName()); } Field[] fid_1 = cla.getFields();//获取Provider及父类定义的属性名称,只能获得public类型的属性 for(Object o:fid_1){ Field fd = (Field)o; System.out.println(fd.getName()); } Method[] med = cla.getDeclaredMethods();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:med){ Method fd = (Method)o; System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); } Method[] med_d = cla.getMethods();//得到Provider及其父类以及父类的父类(以此类推)的所有的public方法,当然子类重写父类的方法的情况下只显示一次。 for(Object o:med_d){ Method fd = (Method)o; System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); } Constructor[] con = cla.getDeclaredConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:con){ Constructor fd = (Constructor)o; TypeVariable[] tv = fd.getTypeParameters(); String para = ""; for(Object otv:tv){ TypeVariable v = (TypeVariable)otv; para += v.getName()+","; } para = para.length()==0?"":para.substring(0, para.length()-1); System.out.println("Constructor:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); } Constructor[] con_c = cla.getConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:con_c){ Constructor fd = (Constructor)o; TypeVariable[] tv = fd.getTypeParameters(); String para = ""; for(Object otv:tv){ TypeVariable v = (TypeVariable)otv; para += v.getName()+","; } para = para.length()==0?"":para.substring(0, para.length()-1); System.out.println("getConstructors:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); }

 

 

           反射 的另三个动态性质: (1) 运行时生成 instances (2) 行期唤起 methods (3) 运行时改动 fields

 

 

Java代码 复制代码  收藏代码java反射机制的理解
  1. try {   
  2.     cla.newInstance();//实例化这个类   
  3. catch (InstantiationException e) {   
  4.     e.printStackTrace();   
  5. catch (IllegalAccessException e)       
  6.     e.printStackTrace();   
  7.  
try { cla.newInstance();//实例化这个类 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }

 

Java代码 复制代码  收藏代码java反射机制的理解
  1. try {   
  2.             Class[] ptypes new Class[2];   
  3.             ptypes[0] Object.class;   
  4.             ptypes[1] String.class;   
  5.                
  6.             Method mm cla.getDeclaredMethod("copy", ptypes);   
  7.             Provider pp (Provider)cla.newInstance();   
  8.             Object ags[] new Object[2];   
  9.             ags[0] new Object();   
  10.             ags[1] new String("Hello,world");   
  11.             mm.invoke(pp, ags);   
  12.         catch (SecurityException e) {   
  13.             // TODO Auto-generated catch block   
  14.             e.printStackTrace();   
  15.         catch (NoSuchMethodException e) {   
  16.             // TODO Auto-generated catch block   
  17.             e.printStackTrace();   
  18.         catch (IllegalAccessException e) {   
  19.             // TODO Auto-generated catch block   
  20.             e.printStackTrace();   
  21.         catch (InstantiationException e) {   
  22.             // TODO Auto-generated catch block   
  23.             e.printStackTrace();   
  24.         catch (InvocationTargetExceptioe) {   
  25.             // TODO Auto-generated catch block   
  26.             e.printStackTrace();   
  27.          
try { Class[] ptypes = new Class[2]; ptypes[0] = Object.class; ptypes[1] = String.class; Method mm = cla.getDeclaredMethod("copy", ptypes); Provider pp = (Provider)cla.newInstance(); Object ags[] = new Object[2]; ags[0] = new Object(); ags[1] = new String("Hello,world"); mm.invoke(pp, ags); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); }
 

 

Java代码 复制代码  收藏代码java反射机制的理解
  1. //运行时变更fields内容   
  2.         try {   
  3.             Field code cla.getDeclaredField("code");   
  4.             Field name cla.getDeclaredField("name");   
  5.                
  6.             Provider pp (Provider)cla.newInstance();   
  7.             name.set(pp, "nameaaa");   
  8.             code.set(pp, "code1");   
  9.             System.out.println("code:"+pp.getCode());   
  10.             System.out.println("name:"+pp.getName());   
  11.                
  12.         catch (SecurityException e) {   
  13.             // TODO Auto-generated catch block   
  14.             e.printStackTrace();   
  15.         catch (NoSuchFieldException e) {   
  16.             // TODO Auto-generated catch block   
  17.             e.printStackTrace();   
  18.         catch (IllegalArgumentException e) {   
  19.             // TODO Auto-generated catch block   
  20.             e.printStackTrace();   
  21.         catch (IllegalAccessException e) {   
  22.             // TODO Auto-generated catch block   
  23.             e.printStackTrace();   
  24.         catch (InstantiationException e) {   
  25.             // TODO Auto-generated catch block   
  26.             e.printStackTrace();   
  27.          
//运行时变更fields内容 try { Field code = cla.getDeclaredField("code"); Field name = cla.getDeclaredField("name"); Provider pp = (Provider)cla.newInstance(); name.set(pp, "nameaaa"); code.set(pp, "code1"); System.out.println("code:"+pp.getCode()); System.out.println("name:"+pp.getName()); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); }
 

 

           在什么环境下使用 java反射?


           我想java反射在java的开源项目中真的用的好多,比如:spring的ioc,JDBC 的 classForName(),strut2中的配置文件的读取应该也是反射,等等。。。而且反射使得编程特别灵活,只要在运行状态下,你知道这个类的名称就可以得到你想到的任何东西,当然包括实例化。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值