JAVA反射机制

来源:互联网 发布:科比王力宏小视频软件 编辑:程序博客网 时间:2024/06/05 16:40

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

package mypakage;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class Admin {

       private String id = "";

       public String getId() {

              return id;

       }

       public void setId(String id) {

              this.id = id;

       }    

       public void println(String para1,String para2){

              System.out.println("para1=" + para1 + "/npara2=" + para2);

       }    

       public void println(String para){

              System.out.println("para=" + para);

       }

       public static void stestMethod(){

              System.out.println("testMethod");

       }    

       public static void main(String[] args) throws ClassNotFoundException,

                     InstantiationException, IllegalAccessException, SecurityException,

                     NoSuchMethodException, IllegalArgumentException,

                     InvocationTargetException {

              String str = "mypakage.Admin";

              Class c = Class.forName(str);

              Admin obj = (Admin)c.newInstance();

           //取到类中相应的方法

              Method m = c.getMethod("println", new Class[]{

Class.forName("java.lang.String"),int.class});

              Method m1 = c.getMethod("setId", new Class[]{Class.forName("java.lang.String")});

              Method m2 = c.getMethod("getId", null);

              Method m3 = c.getMethod("testMethod", null);

              //执行对象中相应的方法

              m.invoke(obj, new Object[]{"admin",1});

              m1.invoke(obj, new String[]{"124567890"});

              java.lang.Object ob = m2.invoke(obj, null);

              m3.invoke(null, null);

              m3.invoke(obj,null);

              //输出属性的值

              System.out.println(ob.toString());

       }

}

 

getMethod(String name, Class... parameterTypes);

返回Class 对象所表示的类或接口的指定公共成员方法。第一外参数name表示Class对象中的方法名称;parameterTypes 表示方法的参数,它是一个Class对象的数组,数组中的元素为方法中的对象参数,例如:

Method m = c.getMethod("println",

new Class[]{Class.forName("java.lang.String"),

int.class});

执行该语句后获得Admin对象中的println方法,对应参数是两个String类型的方法。因此它取到的是println(String para1,String para2)而不是println(String para)方法。且对于基本的 Java 类型(booleanbytecharshortintlongfloat double)和关键字 void 也表示为 Class 对象,即通过int.class这种形式来表示为Classs对象

              Method m2 = c.getMethod("getId", null);

              Method m3 = c.getMethod("testMethod", null);

当第二个参数为空时表示指定方法的没有任何参数。

 

invoke(Object obj, Object... args);

调用指定对象由此 Method 对象表示的基础方法。第一个参数为类对象,第二个参数为调用该方法传入的参数值,例如:

              m.invoke(obj, new Object[]{"admin",1});

调用的对象为Admin,调用的方法为println(String para1,String para2),传入的参数值为一个字符串admin和一个int类型数据1

当指定的方法为一个静态方法时,在调用该方法的时候,我们可以将第一个参数传入一个null值,另外也可以传入一个对象,如:

              m3.invoke(null, null);

              m3.invoke(obj,null);

原创粉丝点击