你的位置:首页 > Java教程

[Java教程]黑马程序员——反射机制


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

反射机制

下面我们一起来探讨一下java的反射机制吧!功能太强大了,哈哈!

 (一).  定义

  Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

1.1 主要功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

1.2 应用范围

  在web应用中不是很多,但反射机制是如今很多流行框架的实现基础,包括Spring、Hibernate等。

1.3 注意

  Java通过Reflection API来完成反射机制,在java.lang.reflect包中有Field、Method、Constructor三个类分别用于描述类的属性、方法、构造方法。

1.4 Constructor类 

  Constructor类用于表示类的构造方法,通过调用Class对象的getConstructor()方法就能获取当前类的构造方法的集合。

1.4.1 Constructor类的方法

  String getName()————返回构造方法的名称
  Class[] getParameterTypes()————返回当前构造方法的参数类型
  int getModifiers()————返回修饰符的整型标识

1.4.2 实践

上代码演示getConstructor()方法获取指定类的构造方法

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Modifier; 5  6 public class ConstructorReflectionDemo { 7  8   public static void main(String[] args) { 9     String name = "java.util.Date";10     try {11       Class c1 = Class.forName(name);12       System.out.println("class " + name + "{");13       getConstructors(c1);14       System.out.println("}");15     } catch (ClassNotFoundException e) {16       System.out.println("Check name of the class!");17     }18   }19 20   public static void getConstructors(Class c1) {21     //返回声明的所有构造方法包括私有的和受保护的,但不包括超类构造方法22     Constructor[] cons = c1.getDeclaredConstructors();23     for(int i=0;i<cons.length;i++){24       Constructor c = cons[i];25       //返回构造方法的名称26       String name = c.getName();27       //通过Modifier类获取修饰符28       System.out.print("  " + Modifier.toString(c.getModifiers()));29       System.out.print(" " + name + "(");30       //获取构造方法的参数31       Class[] paramTypes = c.getParameterTypes();32       //打印构造方法的参数33       for(int j=0;j<paramTypes.length;j++){34         if(j>0){35           System.out.print(",");36         }37         System.out.print(paramTypes[j].getName());38       }39       System.out.println(")");40     }41   }42 }

1.5 Method类

  Method类提供关于类或接口上某个方法的信息,它是用来封装反射类方法的一个类。

1.5.1 Method类方法

  String getName()————返回方法的名称
  Class[] getParameterTypes()————返回当前方法的参数类型
  int getModifiers()————返回修饰符的整型标识
  Class getReturnType()————返回当前方法的返回类型

1.5.2 实践

代码演示getMethod()方法获取指定类的所有的方法信息。

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Method; 4 import java.lang.reflect.Modifier; 5  6 public class MethodReflectionDemo { 7   public static void main(String[] args) { 8     String name = "java.util.Date"; 9     try { 10       //返回指定字符串所代表的类的Class对象11       Class c1 = Class.forName(name);12       System.out.println("class " + name + "\n{");13       getMethods(c1);14       System.out.println("}");15     } catch (ClassNotFoundException e) {16       System.out.println("Check name of the Class");17     }18     System.exit(0);19   }20 21   public static void getMethods(Class c1) {22     //返回声明的所有的方法包括私有的和受保护的,但不包括超类方法23     Method[] methods = c1.getDeclaredMethods();24     //返回公共方法,包括从父类继承的公共方法25 //    Method[] methods1 = c1.getMethods();26     for(int i=0;i<methods.length;i++){27       //获取单个method方法28       Method m = methods[i];29       //获取当前方法的返回类型30       Class retype = m.getReturnType();31       //获取方法名32       String name = m.getName();33       System.out.print("  " + Modifier.toString(m.getModifiers()));//修饰符34       System.out.print(" " + retype.getName() + " " + name + "(");//返回类型、方法名35       //打印参数信息36       Class[] paramtypes = m.getParameterTypes();37       for(int j=0;j<paramtypes.length;j++){38         if(j>0){39           System.out.print(",");40         }41         //打印参数名42         System.out.print(paramtypes[j].getName());43       }44       System.out.println(");");45     }46   }47 }

1.6 Field类

  Field类提供有关类或接口的属性信息。

1.6.1 Field类的方法

  String getName()————返回方法的名称
  Class[] getType()————返回当前属性的参数列表

1.6.3 实践

直接上代码,通过代码理解getField()方法用于获取指定类或接口定义的属性信息。

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Field; 4 import java.lang.reflect.Modifier; 5  6 public class FieldReflectionDemo { 7  8   public static void main(String[] args) { 9     String name = "java.util.Date";10     try {11       Class c1 = Class.forName(name);12       System.out.println("class " + name + "\n{");13       getFields(c1);14       System.out.println("}");15     } catch (ClassNotFoundException e) {16       System.out.println("Check name of the class !");17     }18   }19 20   public static void getFields(Class c1) {21     //返回声明的所有的属性包括私有的和受保护的,但不包括超类属性22     Field[] fields= c1.getDeclaredFields();23     for(int i=0;i<fields.length;i++){24       Field field = fields[i];25       Class type = field.getType();26       String name = field.getName();27       System.out.print(" "+ Modifier.toString(field.getModifiers()));28       System.out.println(" " + type.getName() + " " + name + ";");29       30     }  31   }32 }

要注意:Field类的getDeclaredFields()方法将返回包括私有的和受保护的所有属性定义,但不包括父类的属性;getFields()方法返回的属性列表将包括从父类继承的公共属性。




英国旅游价格特价英国游深圳到英国旅游报价到英国旅游要多少钱英国旅游路线2015春节森波拉酒店住宿免费泡温泉吗?森波拉温泉春节篝火晚会有什么表演? 过年到锦里沟品土家民俗 2015春节佛冈森波拉春节有什么活动?森波拉奇妙世界春节活动介绍? 2015天适樱花悠乐园花期多长?从化天适樱花悠乐园什么时间最好看? 深圳地王大厦观光门票优惠价?地王大厦观光优惠政策? 锦溪古镇怎么去?交通怎么样? 深圳地王大厦简介?地王大厦观光介绍? 苏迪糖果乐园怎么去? 深圳东门老街就是一条街吗? 深圳迪可可小镇在哪里? 深圳有哪些物流公司?哪家物流公司性价比最好? 深圳华强北怎么去?有什么公交直达吗? 钱塘江观潮最佳时间_钱塘江观潮时间_钱塘江观潮最佳地点 大连星海公园门票多少钱_门票价格 哈尔滨冰雪大世界旅游攻略,贴士,注意事项 大连发现王国地址_发现王国在哪里_大连发现王国门票价格多少钱 LTC2630AHSC6-HM12#TRMPBF Datasheet LTC2630AHSC6-HM12#TRMPBF Datasheet LT1228IS8#TRPBF Datasheet LT1228IS8#TRPBF Datasheet LT1242CN8#PBF Datasheet LT1242CN8#PBF Datasheet 春季到哪里旅游 春季到哪里旅游 春季到哪里旅游 六月到什么地方旅游好 六月到什么地方旅游好 六月到什么地方旅游好 现在到哪里旅游好啊 现在到哪里旅游好啊 现在到哪里旅游好啊