JAVA的反射基本原理应用

今天看深入浅JDK学了点东西。。需要记录一下子.JAVA的反射基制的简单应用。

JAVA反射的功能:

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

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

3。在运行时判断任意一个类所具有的方法

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

5。构建动态代理。

新一个类:

 接口就不写了:

class ObjImpl implements ObjInterface {

 @Override
 public String getGreeting() {

  return "Hello World.....王涛";
 }

}

调用类:

public class Runner {
 public static void main(String[] args) {

   Class objClass = Class.forName("com.testreflect.ObjImpl");//加载这个类
 
   ObjInterface obj = (ObjInterface) (objClass.newInstance());// 根据类名得到类的实例
      Method method = obj.getClass().getMethod("getGreeting",null);// 以下根据方法名得到方法对象
    //在调用取得这个方法的对象的时候要注意getMthod();这个方法有哪个参数..第一个是方法的名称。。如果这个方法

  需要参数的话。。要指定。。参数和类型。。否会抛异常:

  如果:getGreeting(String name,Integer count); 则应该是:

obj.getClass().getMethod("getGreeting",new Class[]{String.class,Integer.class});// 参数类型数组

 调用:method.invoke(obj,new Object[]{"wangta",345});

JDK的API是这样解释的:

public Method getMethod(String name,
                        Class<?>... parameterTypes)
                 throws NoSuchMethodException,
                        SecurityException
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 name 参数是一个 String,用于指定所需方法的简称。 parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypesnull,则按空数组处理。

如果 name 是 "<init>;" 或 "<clinit>",则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):

  1. 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
  2. 如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C 类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形参类型,则它就是反映的方法。如果在 C 中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。

注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。

   Object result = method.invoke(obj,null);// 动态调用方法
   System.out.println("返回结果:" + (String) result);

}

}

转自:http://www.dev26.com/home/start

猜你喜欢

转载自wtsoftware.iteye.com/blog/336477
今日推荐