你的位置:首页 > 软件开发 > Java > java学习笔记13

java学习笔记13

发布时间:2015-03-25 23:02:31
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址。Java的反射机制在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? ...

java学习笔记13

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址。

Java反射机制

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。

这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

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

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

在运行时构造任意一个类的对象。

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

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

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

JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

Class类:代表一个类。

Field 类:代表类的成员变量(成员变量也称为类的属性)。

Method类:代表类的方法。

Constructor 类:代表类的构造方法。

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

Proxy类以及InvocationHandler接口:提供了动态生成代理类以及实例的方法

其中,Class类是Reflection API 中的核心类,它有以下方法:

  •     getName():获得类的完整名字 

  •     getFields():获得类的public类型的属性 

  •     getDeclaredFields():获得类的所有属性 

  •     getMethods():获得类的public类型的方法 

  •     getDeclaredMethods():获得类的所有方法 

  •     getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型 

  •     getConstructors():获得类的public类型的构造方法 

  •     getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型 

  •     newInstance():通过类的不带参数的构造方法创建这个类的一个对象 

每当一個类被载入时,JVM就自动为其生成一个Class对象,通过操作class对象,我们可以得到该对象的所有成员并操作它们,举个例子:

package javatest;import java.util.*;class Student {  private String name;  private int age;  private int ID;  public Student() {      }  public Student(String name, int age, int ID) {    this.name = name;    this.age = age;    this.ID = ID;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }}public class javatest {  public static void main(String[] args) {    Student s1 = new Student("java", 20, 123);    Class ss = s1.getClass();    System.out.println("getName: " + ss.getName());    System.out.println("getFields: " + ss.getFields());    System.out.println("getDeclaredFields: " + ss.getDeclaredFields());    System.out.println("getMethods: " + ss.getMethods());    System.out.println("isInterface: " + ss.isInterface());    System.out.println("isPrimitive: " + ss.isPrimitive());    System.out.println("isArray: " + ss.isArray());    System.out.println("SuperClass: " + ss.getSuperclass().getName());  }}

接着,可以快速浏览一下 newProxyInstance 方法,因为其相当简单:

清单 7. Proxy 静态方法 newProxyInstance

public static Object newProxyInstance(ClassLoader loader,       Class<?>[] interfaces,       InvocationHandler h)       throws IllegalArgumentException {     // 检查 h 不为空,否则抛异常  if (h == null) {     throw new NullPointerException();   }   // 获得与制定类装载器和一组接口相关的代理类类型对象  Class cl = getProxyClass(loader, interfaces);   // 通过反射获取构造函数对象并生成代理类实例  try {     Constructor cons = cl.getConstructor(constructorParams);     return (Object) cons.newInstance(new Object[] { h });   } catch (NoSuchMethodException e) { throw new InternalError(e.toString());   } catch (IllegalAccessException e) { throw new InternalError(e.toString());   } catch (InstantiationException e) { throw new InternalError(e.toString());   } catch (InvocationTargetException e) { throw new InternalError(e.toString());   } }

原标题:java学习笔记13

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。