分享

java反射机制method用法

 真爱图书 2011-10-14

import java.lang.reflect.Method;

public class MethodTest {

    static void staticMethod()
    {
        System.out.println("执行staticMethod()方法");
    }
    public int publicMethod(int i)
    {
        System.out.println("执行publicMethod()方法");
        return i*20;
    }
    protected int protectedMethod(String s,int  i) throws NumberFormatException{
        System.out.println("执行protectedMethod()方法");
        return Integer.valueOf(s)+i;
    }
    private String privateMethod(String...strings){
        System.out.println("执行privateMethod()方法");
        StringBuffer stringBuffer = new StringBuffer();
        for(int i=0;i<strings.length;i++)
        {
            stringBuffer.append(strings[i]);
        }
        return stringBuffer.toString();
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //实例化一个对象:
        MethodTest methodTest = new MethodTest();
       
        Method[] declaredMethods = MethodTest.class.getDeclaredMethods();  //获得所有的方法
        for(int i=0;i<declaredMethods.length;i++)
        {
            Method method = declaredMethods[i];
            System.out.println("名称:"+method.getName());   //方法名称
            System.out.println("是否允许带有可变参数变量:"+method.isVarArgs());//
            System.out.println("入口参数类型依次为:");
            Class[]parameterTypes = method.getParameterTypes();//获得方法所有的参数类型
            for(int j=0;j<parameterTypes.length;j++)
            {
                System.out.println("parameterTypes[" + j + "]" + parameterTypes[j]);
            }
            System.out.println("返回值类型:"+method.getReturnType()); //获得方法返回值类型
            System.out.println("可能抛出异常类型有:");
            Class []exceptionTypes = method.getExceptionTypes();  //获得可能抛出的所有异常类型
            for(int j=0;j<exceptionTypes.length;j++){
                System.out.println("exceptionTypes[" + j + "]" + exceptionTypes[j]);
            }
            boolean isTurn = true;
            while(isTurn)     //调用类中的方法
            {
                try
                {
                    isTurn = false;
                    if(i==0)   //请注意生成的顺序,可以先把这些语句注释掉,看下顺序再另行执行。
                    {
                        method.invoke(methodTest);
                    }    else if(i==1)
                    {
                        System.out.println("返回值:" + method.invoke(methodTest,168));
                    }else if(i==2)
                    {
                        System.out.println("返回值:" + method.invoke(methodTest,"7",5));
                    }else if(i==3)
                    {
                        Object[] parameters = new Object[]{new String[]{"M","W","Q"}};
                        System.out.println("返回值:"+method.invoke(methodTest, parameters));
                    }
                }catch(Exception e)
                {
                    System.out.println("在执行方法时抛出异常,执行setAccessible()方法");
                    method.setAccessible(true);
                    isTurn = true;
                }
            }
            System.out.println("****************");
        }
    }

}

  1. Invoke用法说明
  2. import java.lang.reflect.Method;   
  3.   
  4. public class InvokeTester {   
  5.   
  6. public int add(int param1, int param2) {   
  7.   return param1 + param2;   
  8. }   
  9.   
  10. public String echo(String mesg) {   
  11.   return "echo" + mesg;   
  12. }   
  13.   
  14. public static void main(String[] args) throws Exception {   
  15.    Class classType = InvokeTester.class;   
  16.    Object invokertester = classType.newInstance();    //下面介绍与new 的区别
  17.      
  18.    Method addMethod = classType.getMethod("add", new Class[] { int.class,   
  19.     int.class });   
  20.   //Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,   
  21.   //如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,   
  22.   //如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,   
  23.   //再将其返回   
  24.    Object result = addMethod.invoke(invokertester, new Object[] {   
  25.     new Integer(100), new Integer(200) });   
  26.   //在jdk5.0中有了装箱 拆箱机制 new Integer(100)可以用100来代替,系统会自动在int 和integer之间转换   
  27.    System.out.println(result);   
  28.   
  29.    Method echoMethod = classType.getMethod("echo",   
  30.     new Class[] { String.class });   
  31.    result = echoMethod.invoke(invokertester, new Object[] { "hello" });   
  32.    System.out.println(result);   
  33. }   
  34. }  

//==================================

newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。

newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多