`
fuwa_jane
  • 浏览: 50079 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java语言的反射机制1

    博客分类:
  • Java
阅读更多

 

本文摘自:http://happyday.iteye.com/blog/309508

 

 

      java语言的反射机制为是java语言所提供的一项特别吸引人的地方,利用反射我们可以对程序的运行进行动态的监控,开发使用反射特性的程序需要使用一些专门的工具类,这些工具类位于java.lang.reflect包中。

1.Class类简介

    Class类属于java.lang包中,不需要使用import语句的引入就可以直接使用,其对象代表一个类,并携带类的一些信息,主要包含构造器,方法和成员变量。

   注:a.java程序在运行的过程中,每个类加载后都在内存中产生一个对应的Class对象,一般来说,这个对象由系统来自动维护,不需要程序开发人员关心,

        b.这里的Class中的“C”为大写,如果变成小写就声明成java的关键字了
下面首先通过一个列子来说明反射机制的使用

package com;  
import java.lang.reflect.Method;  
public class ReflectTest {  
    Method method [];  
    public ReflectTest(){  
        try{  
        Class c=Class.forName("com.ReflectTest");  
        method=c.getMethods();  
        }catch(ClassNotFoundException e){  
            e.printStackTrace();  
        }  
        if(method.length>0){  
            for(int i=0;i<method.length;i++){  
                System.out.println(method[i]);  
            }  
        }  
    }  
    public static void main(String args []){  
    new ReflectTest();  
    }  
}  

 

这个例子就介绍了反射机制的一些简单的使用方法,首先Class.forName(String)获得一个类的信息,然后就可以对这个类的构造器,方法和成员变量等进行反射了,注意的是:forName(String)中的字符串必须是类完整路径,否则会出现ClassNotFoundException的异常。

 

 另外,由于java中的数组是对象,因此数组对象也可以调用getClass()方法获取对应类的Class对象。 

  1. public class ArrayReflection {  
  2.         public ArrayReflection(){  
  3.         String []stringArray=new String[4];  
  4.         int[][]intArray=new int[4][4];  
  5.         Class sc=stringArray.getClass();  
  6.         Class ic=intArray.getClass();  
  7.         System.out.println("一维string数组对应的类名为<span style="color: #000000;">:"+</span>sc.getName());  
  8.         System.out.println("二维int数组对应的类名为:"+ic.getName());  
  9.     }  
  10.     public static void main(String args []){  
  11.         new ArrayReflection();  
  12.     }  
  13.   
  14. }  
  15. //运行结果为:  
  16. 一维string数组对应的类名为:[Ljava.lang.String;  
  17. 二维int数组对应的类名为:[[I  

 从运进结果我们可以看出,数组对象也有对应的类,"["表示数组,两个就表示二维数组。

在java中,每种基本数据类型都有对应的代号,对于int----I,boolean---Z,byte--B,char--C,long---J.可以到java网站查询详情

2.Field类的简单介绍

  Field类的对象代表成员变量,携带的是成员变量的一些信息,需要注意的是,与Class类相似,Field对象不能通过构造方法的形式来创建对象,必须通过Class类提供的get方法来获得。

import java.lang.reflect.Field;  
public class FieldReflectTest {  
    public static void main(String args []){  
        try{  
            Student stu=new Student(21,2003,true,"tom");  
            Class c=stu.getClass();  
            Field field[]=c.getFields();  
            for(int i=0;i<field.length;i++){  
            System.out.println(field[i].getName());  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
  
}  
  
class Student{  
    public int age;  
    public int sno;  
    public boolean gender;  
    public String name;  
    public Student(int age,int sno,boolean gender,String name){  
        this.age=age;  
        this.sno=sno;  
        this.gender=gender;  
        this.name=name;  
    }  
}  
//运行结果 age,sno,gender,name 

 

从运行结果我们可以看出,我们可以利用对Student对象的反射,获得Student类的全部全局变量信息,注:只能获得修饰符为public 的全局变量,如果修饰符该为private将不能获得。 

3.Mehod类的简介,

  Method类的对象表示一个方法,主要用来携带方法的信息,它与Field类相似,不能通过构造器创建,而必须通过Class类的get方法来获得,主要可以使用的方法有:1.getName()获得方法名称,2.Class[] getParameterTypes()返回参数的序列, 3.Class getReturnType()返回方法返回值的类型。4.Object invoke(Object object,Object []args)此方法用来调用Method对象代表的方法,返回值是被调用方法的返回值,注:该方法无论方法返回什么值,都是做为Object对象返回。

import java.lang.reflect.Method;  
public class MethodReflect {  
    public static void main(String args []){  
        try{  
            ForeMethod fore=new ForeMethod();  
            Class cl=fore.getClass();  
            Method method[]=cl.getMethods();  
            for(int i=0;i<method.length;i++){  
                System.out.println("方法的返回值:"+method[1].getReturnType().getName());  
                System.out.println("方法的名称为:"+method[i].getName());  
                Class []cls=method[i].getParameterTypes();  
                for(int j=0;j<cls.length;j++){  
                    System.out.print(method[i].getName()+"方法对应的参数为:"+cls[i].getName());  
                }  
                System.out.println();  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
  
}  
 class ForeMethod{  
    public void sayHello(String name){  
        System.out.println("你好,"+name);  
    }  
    public String generateNum(int max,int min){  
        return (Math.random()*(max-min))+"";  
    }  
 }  

 

通过这个列子,我们就可以简单的了解Method类在反射机制中的使用了

分享到:
评论

相关推荐

    Java语言反射机制原理探析.zip

    Java语言反射机制原理探析

    Java语言反射机制原理探析.pdf

    Java语言反射机制原理探析.pdf

    Java语言的反射机制

    Java语言的反射机制 Java Reflection API

    Java 语言的反射机制

    Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的...

    Java语言的反射机制.pdf

    Java语言的反射机制

    java的反射机制

    java语言的反射机制详细解说

    Java语言的反射机制.rar

    Java 反射机制主要提供了以下功能: l 在运行时判断任意一个对象所属的类; l 在运行时构造任意一个类的对象; l 在运行时判断任意一个类所具有的成员变量和方法; l 在运行时调用任意一个对象的方法; l 生成...

    JAVA反射机制的简单理解

    有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:

    java反射机制demo

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

    java反射机制代码

    一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

    Java 反射机制浅析

    这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机...

    JAVA语言中的反射机制.doc

    JAVA语言中的反射机制

    Java反射机制的工作原理详解.docx

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的...

    JAVA反射机制详解

    Java 反射机制主要提供 了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态...

    java-反射机制-源码

    java-反射机制-源码

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第4页。 3.2.2 反射机制的功能 反射机制的功能如下: 在运行时判定任意...

Global site tag (gtag.js) - Google Analytics