|
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。 可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例,通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法.
下面就是获得一个 Class 对象的方法之一: 1: Class c = Class.forName("java.lang.String"); 这条语句得到一个 String 类的类对象。 2: Class c2=String.class; 3: String s=“aa”; Class cl=s.getClass(); 还有另一种方法,如下面的语句:Class c = int.class; 或者 Class c = Integer.TYPE; 它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。 OK,下面就来写几段简单代码,用来动态调用类里面的方法. 首先是一个基本的User类 package org.hj.po; public class User { public String get(){ return "无参数"; } public String get(String s){ return s; } public String get(int i,String s){ return i+s; } } 然后再写个调用的类,通过反射来动态调用.注解已标明,代码如下: package org.hj.po; import java.lang.reflect.Method; public class Test { /** * 调用无参方法 * @param cls一个Class实例 * @param methodname一个方法名 */ public void invoke1(Class cls,String methodname)throws Exception{ Method m=cls.getMethod(methodname); Object o=m.invoke(cls.newInstance()); System.out.println(o); }
/** * 调用有一个参数的方法 * @param cls 一个类的Class对象 * @param methodname一个方法的名字 */ public Object invoke2(Class cls,String methodname)throws Exception{ Method m=cls.getMethod(methodname,new Class[]{String.class}); return m.invoke(cls.newInstance(),"aaa"); } /** * 调用有两个参数的方法 * @param cls * @param methodname * @return * @throws Exception */ public Object invoke3(Class cls,String methodname)throws Exception{ Method m=cls.getMethod(methodname,new Class[]{int.class,String.class}); Object o=m.invoke(cls.newInstance(),12,"bbbb"); return o; } public static void main(String[] args)throws Exception { Test t=new Test();
t.invoke1(User.class,"get");
Object o=t.invoke2(User.class,"get"); System.out.println(o);
Object ob=t.invoke3(User.class,"get"); System.out.println(ob);
} } OK,上面就是通过反射动态调用某个类里面的方法.
|
一共有 0 条评论