今天看深入浅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
对象的一个数组。如果
parameterTypes
为
null
,则按空数组处理。
如果 name
是 "<init>
;" 或 "<clinit>
",则将引发 NoSuchMethodException
。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):
- 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
- 如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。
Object result = method.invoke(obj,null);// 动态调用方法
System.out.println("返回结果:" + (String) result);
}
}