疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java反射机制简介


 

   

  在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  反射提供了在运行时,获取类信息的方式。而不必编译器在编译时必须知道该类(这样,使得java作为静态语言拥有了动态语言的特性)。

  反射机制主要提供了以下功能:

  1.在运行时判断任意一个对象所属的类;

  2.在运行时构造任意一个类的对象;

  3.在运行时判断任意一个类所具有的成员变量和方法;

  4.在运行时调用任意一个对象的方法;

  5.生成动态代理。

  Class对象,包含了与类相关的信息,每当编写并编译一个新类,就会产生一个Class对象,及是保存在一个同名的.class文件中。一个类的所有对象就是根据这个类被加载进内存的Class对象创建的。

  运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。

  如何取得操作类的Class对象,常用的有三种方式:

  1.调用Class的静态方法forName。

  2.使用类的.class。

  3.调用对象的getClass方法。

  package com;

  public class TestMain {

  public static void main(String[] args) {

  Class c = null;

  //

  try {

  c = Class.forName("com.Test");

  } catch (ClassNotFoundException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  //

  c = Test.class;

  //

  Test t = new Test();

  c = t.getClass();

  }

  }

  class Test {

  }

  使用java的反射,一般需要遵循三步:

  1.获得你想操作类的Class对象

  2.通过第一步获得的Class对象去取得操作类的方法或是属性名

  3.操作第二步取得的方法或是属性

  public class TestMain {

  public static void main(String[] args) {

  Class c = null;

  try {

  // 获取Class对象

  c = Class.forName("com.Test");

  // 获取method

  Method m = c.getMethod("write", String.class);

  // 操作属性

  String b = (String) m.invoke(c.newInstance(), "test");

  // 打印返回值

  System.out.println(b);

  } catch (ClassNotFoundException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (NoSuchMethodException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (SecurityException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (IllegalAccessException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (IllegalArgumentException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (InvocationTargetException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  } catch (InstantiationException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

  class Test {

  public String write(String s) {

  System.out.println(s);

  return "back:" + s;

  }

  }

  主要的概念信息:

  1.Class 类的实例表示正在运行的 Java 应用程序中的类和接口(枚举是一种类,注释是一种接口)。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

  Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的

  2.Method提供关于类或者接口上单独某个方法及如何访问该方法的信息。所反映的可能是类方法,实例方法或者抽象方法。

  Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。

  3.Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

  Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException。