反射

JDK8在线Api中文手册

JDK8在线Api英文手册

反射


   反射是软件分析自身的能力,这个功能是由java.lang.reflect包和Class中的元素提供的。反射是最重要的功能,特别是当使用调用了Java Bean的组件时。通过反射可以确定类提供的方法、构造函数以及域变量。
   java.lang.reflect包提供了一些接口。其中Member接口定义的方法,可以获取与类的域变量、构造函数或方法相关的信息。在这个包中还有另外10个类,表1列出了这些类。

表1 在java.lang.reflect包中定义的类

| 类 |主 要 功

AccessibleObject
Array
Constructor
Executable
Field
Method
Modifier
Parameter
Proxy
ReflectPermission

   下面的程序演示了Java反射功能的一个简单应用,打印输出java.awt.Dimension类的构造函数、域变量以及方法。该程序首先使用Class类的forName()方法来获取一个java.awt.Dimension类对象。一旦获取这个类对象,就使用getConstructors()、getFields()以及getMethods()方法分析这个类对象。它们返回一些数组,元素分别由Constructor、Field以及Method类定义了一些方法,用户获取与对象相关的信息。每个类都提供了toString()方法。所以使用Constructor、Field以及Method对象作为println()方法的参数是很直观的,正如在以下程序中显示的那样:

//Demonstrate reflection.
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class ReflectionDemo1 {
  public static void main(String[] args) {
      try {
          Class<?> c= Class.forName("java.awt.Dimension");
          System.out.println("Constructors:");
          Constructor<?> constructors[]=c.getConstructors();
          for (int i=0;i<constructors.length;i++){
              System.out.println(" "+constructors[i]);
          }
          System.out.println("Fields:");
          Field fields[]=c.getFields();
          for(int i=0;i<fields.length;i++){
              System.out.println(" "+fields[i]);
          }
          System.out.println("Methods:");
          Method methods[]=c.getMethods();
          for (int i=0;i<methods.length;i++){
              System.out.println(" "+methods[i]);
          }
      } catch (ClassNotFoundException e) {
          System.out.println("Exception: "+e);
      }

  }
  /*
  输出:
  Constructors:
   public java.awt.Dimension(java.awt.Dimension)
   public java.awt.Dimension()
   public java.awt.Dimension(int,int)
  Fields:
   public int java.awt.Dimension.width
   public int java.awt.Dimension.height
  Methods:
   public boolean java.awt.Dimension.equals(java.lang.Object)
   public java.lang.String java.awt.Dimension.toString()
   public int java.awt.Dimension.hashCode()
   public java.awt.Dimension java.awt.Dimension.getSize()
   public void java.awt.Dimension.setSize(double,double)
   public void java.awt.Dimension.setSize(int,int)
   public void java.awt.Dimension.setSize(java.awt.Dimension)
   public double java.awt.Dimension.getHeight()
   public double java.awt.Dimension.getWidth()
   public java.lang.Object java.awt.geom.Dimension2D.clone()
   public void java.awt.geom.Dimension2D.setSize(java.awt.geom.Dimension2D)
   public final void java.lang.Object.wait() throws java.lang.InterruptedException
   public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
   public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
   public final native java.lang.Class java.lang.Object.getClass()
   public final native void java.lang.Object.notify()
   public final native void java.lang.Object.notifyAll()
   */
}

   下一个例子使用Java的反射功能来获取类的公有方法。程序首先实例化类A。为这个对象引用应用getClass()方法,该方法返回类A的Class对象。getDeclaredMethods()方法返回一个Method对象数组,该数组只描述这个类声明的方法,不包含从超类(如Object)继承的方法。
   然后出了methods数组中的每个元素。getModifiers()方法返回一个包含标志的int值,标志描述了为数组元素应用了哪个修饰符。Modifiers类提供了一套"is"方法,如表2所示,可以使用这套方法分析这个int值。例如,如果参数包含"public"修饰符,静态方法isPublic()就返回true;否则返回false。在下面的程序中,如果某个方法支持公有访问,那么可以通过getName()方法来获取这个方法的名称,然后打印输出:

public class A {
   public void a1(){
   }
   public void a2(){
   }
   protected void a3(){
   }
   private void a4(){
   }
}
//Show public methods.
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
class ReflectionDemo2 {
  public static void main(String[] args) {
      try {
          A a = new A();
          Class<?> c = a.getClass();
          System.out.println("Public Methods: ");
          Method methods[] = c.getDeclaredMethods();
          for (int i = 0; i < methods.length; i++) {
              int modifiers = methods[i].getModifiers();
              if (Modifier.isPublic(modifiers)) {
                  System.out.println(" " + methods[i].getName());
              }
          }
      } catch (Exception e) {
          System.out.println("Exception: " + e);
      }
  }
  /*
  输出:
  Public Methods:
   a2
   a1
   */
}
表2 Modifier类定义的用于确定访问修饰符的"is"方法
方 法描 述
static boolean isAbstract(int val)如果val中设置了abstract标志,就返回true;否则返回false
static boolean isFinal(int val)如果val中设置了final标志就返回true;否则返回false
static boolean isInterface(int val)如果val中设置了interface标志,就返回true;否则返回false
static boolean isNative(int val)如果val中设置了native标志就返回true;否则返回false
static boolean isPrivate(int val)如果val中设置了private标志,就返回true;否则返回false
static boolean isProtected(int val)如果val中设置了protected标志就返回true;否则返回false
static boolean isAbstract(int val)如果val中设置了abstract标志,就返回true;否则返回false
static boolean isPublic(int val)如果val中设置了public标志就返回true;否则返回false
static boolean isStatic(int val)如果val中设置了static标志,就返回true;否则返回false
static boolean isStrict(int val)如果val中设置了strict标志就返回true;否则返回false
static boolean isSynchronized(int val)如果val中设置了synchronized标志,就返回true;否则返回false
static boolean isTransient(int val)如果val中设置了transient标志就返回true;否则返回false
static boolean isVolatile(int val)如果val中设置了volatile标志就返回true;否则返回false

   Modifier类还提供了一套静态方法,这套方法返回一下访问修饰符的类型,这些访问修饰符能够应用于特定类型的程序元素。这套方法是:

static int classModifiers()
static int constructorModifiers()
static int fieldModifiers()
static int interfaceModifiers()
static int methodModifiers()
static int parameterModifiers()(Added by JDK8)

   例如,methodModifier()方法返回能够用于方法的修饰符。每个方法返回的标志用来指示哪个修饰符是合法的,这些标志被打包到一个int值中。修饰符的值是通过Modifier类中的常量定义的,包括 PROTECTED、PUBLIC、PRIVATE、STATIC、FINAL等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值