Java反射机制:核心是动态!

1. 返回来自命令行输入的某目标类的构造方法和各成员方法:

import java.lang.reflect.*;

class ClassTest

{

   publicstaticvoid main(String[] args)

  

      if(args.length!=1)

      {

        return;

      }

      try

      {

        Class c=Class.forName(args[0]); //从命令行得到一个类

 

        Constructor[] cons=c.getDeclaredConstructors();

//得到该类的所有构造方法,无论是带参数的还是不带参数的

        for(int i=0;i<cons.length;i++)

        {

           System.out.println(cons[i]);

        }

//得到该类的所有成员方法

        Method[] ms=c.getDeclaredMethods();

        for(int i=0;i<ms.length;i++)

        {

           System.out.println(ms[i]);

        }

      }

      catch(Exception e)

      {

        e.printStackTrace();

      }

   }

}

class Point

{

   static

   {

      System.out.println("Loading Point");

   }

   intx,y;

   void output()

   {

      System.out.println("x="+x+","+"y="+y);

   }

   Point(int x,int y)

   {

      this.x=x;

      this.y=y;

   }

}

class Line

{

   static

   {

      System.out.println("Loading Line");

   }

}

 

2. 通过反射,获取了构造方法,并获取构造方法的参数类型,创建了参数的对象数组,给参数赋值,通过使用带参数的构造方法创建了一个类的对象(Object o=cons[0].newInstance(paramValues);),并调用了对象的成员方法。

 

import java.lang.reflect.*;

class ClassTest

{

   publicstaticvoid main(String[] args)

  

      if(args.length!=1)

      {

        return;

      }

      try

      {

        Class c=Class.forName(args[0]);  //类的名字,来自命令提示行

        Constructor[] cons=c.getDeclaredConstructors();//类的构造方法数组

 

        Class[] params=cons[0].getParameterTypes(); 

        //当前类中,只有一个构造方法。cons[0]表示的是第一个构造方法。

        //使用cons[0].getParameterTypes();得到参数的类型

        

        for(int i=0;i<params.length;i++){

        System.out.println("params[]:" + params[i]);

        }

        //输出结果为:params:int

        //params:int

       

        Object[] paramValues=new Object[params.length];

        //使用一个对象数组来存放参数的值,对象数组的大小和参数类型数组的大小相等

             

        for(int i=0;i<params.length;i++)

        {

           if(params[i].isPrimitive())//参数是否是基本数据类型

           {

              paramValues[i]=new Integer(i+3);//给参数赋值

           }

        }

       

        for(int i=0;i<paramValues.length;i++){

           System.out.println("paramValues[]:" + paramValues[i]);

           }

        //输出结果为:paramValues:3

        //paramValues:4

       

        Object o=cons[0].newInstance(paramValues);

        //传递参数到有参数构造方法Point(int x,int y)

        //并用paramValues给构造方法赋值,paramValues是一个数组,所以多个参数可以支持。

       

        Method[] ms=c.getDeclaredMethods();//类当中的成员方法数组

       

        ms[0].invoke(o,null);

        //调用类中第一个成员方法,其实就是output();

        //o是目标类的对象,null是被调用的方法的参数。当前例子中output()没有参数,所以这里用null

      }

      catch(Exception e)

      {

        e.printStackTrace();

      }

   }

}

class Point

{

   static

   {

      System.out.println("Loading Point");

   }

   intx,y;

   void output()

   {

      System.out.println("x="+x+","+"y="+y);

   }

   Point(int x,int y)

   {

      this.x=x;

      this.y=y;

   }

}

class Line

{

   static

   {

      System.out.println("Loading Line");

   }

}

 

使用反射的场合:调试器,类的浏览器,图形界
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值