`

java语言的反射机制1

    博客分类:
  • java
阅读更多

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

1.Class类简介

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

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

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

Java代码 复制代码
  1. package com;   
  2. import java.lang.reflect.Method;   
  3. public class ReflectTest {   
  4.     Method method [];   
  5.     public ReflectTest(){   
  6.         try{   
  7.         Class c=Class.forName("com.ReflectTest");   
  8.         method=c.getMethods();   
  9.         }catch(ClassNotFoundException e){   
  10.             e.printStackTrace();   
  11.         }   
  12.         if(method.length>0){   
  13.             for(int i=0;i<method.length;i++){   
  14.                 System.out.println(method[i]);   
  15.             }   
  16.         }   
  17.     }   
  18.     public static void main(String args []){   
  19.     new ReflectTest();   
  20.     }   
  21. }  
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对象。 

 

 

 

 

 

Java代码 复制代码
  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  
public class ArrayReflection {
		public ArrayReflection(){
		String []stringArray=new String[4];
		int[][]intArray=new int[4][4];
		Class sc=stringArray.getClass();
		Class ic=intArray.getClass();
		System.out.println("一维string数组对应的类名为:"+sc.getName());
		System.out.println("二维int数组对应的类名为:"+ic.getName());
	}
	public static void main(String args []){
		new ArrayReflection();
	}

}
//运行结果为:
一维string数组对应的类名为:[Ljava.lang.String;
二维int数组对应的类名为:[[I

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

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

2.Field类的简单介绍

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

Java代码 复制代码
  1. import java.lang.reflect.Field;   
  2. public class FieldReflectTest {   
  3.     public static void main(String args []){   
  4.         try{   
  5.             Student stu=new Student(21,2003,true,"tom");   
  6.             Class c=stu.getClass();   
  7.             Field field[]=c.getFields();   
  8.             for(int i=0;i<field.length;i++){   
  9.             System.out.println(field[i].getName());   
  10.             }   
  11.         }catch(Exception e){   
  12.             e.printStackTrace();   
  13.         }   
  14.     }   
  15.   
  16. }   
  17.   
  18. class Student{   
  19.     public int age;   
  20.     public int sno;   
  21.     public boolean gender;   
  22.     public String name;   
  23.     public Student(int age,int sno,boolean gender,String name){   
  24.         this.age=age;   
  25.         this.sno=sno;   
  26.         this.gender=gender;   
  27.         this.name=name;   
  28.     }   
  29. }   
  30. //运行结果 age,sno,gender,name  
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对象返回。

Java代码 复制代码
  1. import java.lang.reflect.Method;   
  2. public class MethodReflect {   
  3.     public static void main(String args []){   
  4.         try{   
  5.             ForeMethod fore=new ForeMethod();   
  6.             Class cl=fore.getClass();   
  7.             Method method[]=cl.getMethods();   
  8.             for(int i=0;i<method.length;i++){   
  9.                 System.out.println("方法的返回值:"+method[1].getReturnType().getName());   
  10.                 System.out.println("方法的名称为:"+method[i].getName());   
  11.                 Class []cls=method[i].getParameterTypes();   
  12.                 for(int j=0;j<cls.length;j++){   
  13.                     System.out.print(method[i].getName()+"方法对应的参数为:"+cls[i].getName());   
  14.                 }   
  15.                 System.out.println();   
  16.             }   
  17.         }catch(Exception e){   
  18.             e.printStackTrace();   
  19.         }   
  20.     }   
  21.   
  22. }   
  23.  class ForeMethod{   
  24.     public void sayHello(String name){   
  25.         System.out.println("你好,"+name);   
  26.     }   
  27.     public String generateNum(int max,int min){   
  28.         return (Math.random()*(max-min))+"";   
  29.     }   
  30.  }  
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类在反射机制中的使用了

源自:http://www.iteye.com/topic/309508

分享到:
评论

相关推荐

    java面试题--反射机制

    这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许...

    Java反射机制 Java反射机制

    Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用...

    java的反射机制及其实际应用

    Java作为一种强大的编程语言,提供了许多高级特性,其中反射机制尤为突出。通过反射,开发者可以在运行时动态地获取类的信息并操纵类的行为,从而实现更加灵活和扩展性强的程序设计。 #### 二、Java中的类反射 ###...

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

    在Java语言中,反射机制是通过JVM(Java虚拟机)逆向执行的过程来实现的。具体来说,反射机制允许在运行时动态创建类的实例,动态调用类的方法,以及访问和设置类的属性等。本文将深入探讨Java反射机制的原理及其在...

    JAVA反射机制应用

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

    Java中的反射机制

    此外,LEAD/LEAD++、OpenC++、MetaXa和OpenJava等编程语言都是基于反射机制构建的。 反射不仅限于编程语言领域,近年来也被广泛应用于视窗系统、操作系统以及文件系统中。尽管“反射”一词在计算机科学中有着全新的...

    Java 1.5 反射机制

    Java 1.5引入的反射机制是其动态性的一个重要体现,它允许程序在运行时检查和操作类、接口、对象及其方法。反射为开发者提供了强大的能力,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及处理...

    Java语言的反射机制.pdf

    Java语言的反射机制 Java语言的反射机制是Java语言中一个非常重要的机制,它允许程序在运行时加载、探知、使用编译期间完全未知的class。这种“看透class”的能力被称为introspection。反射机制的概念是由Smith在...

    反射实例-JAVA反射机制

    这是Java语言特有的功能,使得Java程序比其他语言(如C、C++)更加灵活。 ##### 2.1 Reflection的工作机制示例 下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; ...

    候捷谈Java反射机制

    Java反射机制是Java编程语言...总之,Java反射机制是Java语言中一个强大的工具,它增强了Java的灵活性,允许开发者在运行时探索和操作类的内部结构。尽管反射带来了诸多便利,但也需要合理使用,以平衡灵活性和稳定性。

    JAVA的反射机制与动态代理.pdf

    JAVA的反射机制与动态代理是JAVA语言中非常重要的特性之一,它们为开发者提供了极大的灵活性。反射机制允许我们在运行时动态地获取类的信息和操作类的对象,而动态代理则进一步扩展了这种能力,使得我们可以灵活地为...

    java反射机制详解

    反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以自我检查、自我调整。 在Java中,所有的类型都是`...

    Java反射机制

    Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法等,并能够调用类的任意方法。这种能力对于构建高度灵活和...

    Java反射机制总结

    ### Java反射机制总结 ...总之,Java反射机制是Java语言的一个重要特性,它提供了在运行时动态获取类信息和操作类结构的能力。合理使用反射可以提高程序的灵活性和扩展性,但在使用时也需要考虑到其潜在的问题和限制。

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

    Java语言的反射机制是其强大的特性之一,它允许在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这一机制对于理解和利用Java的灵活性至关重要,尤其在元编程、框架设计、插件系统以及...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

Global site tag (gtag.js) - Google Analytics