我是靠谱客的博主 勤奋冷风,最近开发中收集的这篇文章主要介绍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");

   }

}

 

使用反射的场合:调试器,类的浏览器,图形界

最后

以上就是勤奋冷风为你收集整理的Java反射机制:核心是动态!的全部内容,希望文章能够帮你解决Java反射机制:核心是动态!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部