zoukankan      html  css  js  c++  java
  • 反射机制

    反射机制

    下面我们一起来探讨一下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 + "
    {");
    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 + "
    {");
    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()方法返回的属性列表将包括从父类继承的公共属性。

  • 相关阅读:
    梦想就是梦想,不要让它成为杯具
    程序员,离开了库你还能干什么?
    采用WPF框架编写的3D软渲染Demo
    what the hell with Gimbal Lock?
    FX Composer VS RenderMonkey 使用对比之 FX Composer篇
    为什么你应该使用OpenGL而不是DirectX?
    游戏中的夜视效果实现
    {转}深入浅出之正则表达式(一)
    正则表达式30分钟入门教程版本:v2.31 (2009411) 作者:deerchao 转载请注明来源
    2013年
  • 原文地址:https://www.cnblogs.com/pingfan21/p/4950419.html
Copyright © 2011-2022 走看看