JAVA反射机制

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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值