在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
[color=red]Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法[/color]
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods
[color=red]在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法[/color]
先看一个简单的例子
上面的例子是给定一个完整的类名。然后就可以知道所有这个类中的公共方法
那么怎么调用类中的方法呢。看下面的例子
jkd提供了invoke方法调用对象的方法
[color=red]在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法[/color]
如果想反射一个类。那么必须知道他的类类型。也就是class object
一共有如下几种方法
[color=red]Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法[/color]
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods
[color=red]在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法[/color]
先看一个简单的例子
package com.smallq.reflection;
import java.lang.reflect.Method;
/**
* 最简反射示例
*
* @author smallq
*
*/
public class ShowMethods {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 根据完整的类名得到对象的类型
Class<?> classType = Class.forName("java.util.Date");
// 取对象的所有方法
Method method[] = classType.getDeclaredMethods();
// 输出
for (int i = 0; i < method.length; i++) {
System.out.println(method[i].toString());
}
}
}
上面的例子是给定一个完整的类名。然后就可以知道所有这个类中的公共方法
那么怎么调用类中的方法呢。看下面的例子
package com.smallq.reflection;
import java.lang.reflect.Method;
/**
* 反射例子
*
* @author smallq
*
*/
public class InvokeTester {
public int add(int a, int b) {
return a + b;
}
public String echo(String str) {
return "echo: " + str;
}
public static void main(String[] args) throws Exception, Exception {
// 得到对象类型
Class<?> classType = InvokeTester.class;
// 根据类型实例化对象,这里使用newInstance方法只能实例化具有无参构造方法的对象
Object invokeTester = classType.newInstance();
/**
* 如果类提供了有参构造方法.则使用下面的方法得到实例,有参则在下面两个大括号中写 new Class.和new Object是对应的
*/
// Object invokeTester = classType.getConstructor(new
// Class[]{}).newInstance(new Object[]{});
// 取对象的方法(方法名,方法参数的类型)
Method addMethod = classType.getMethod("add", new Class[] { int.class,
int.class });
// 调用InvokeTester对象的add()方法
// 提供参数(对象的实例,方法需要的参数)方法参数必须是类类型.不能是基本类型.但是jdk1.5提供了自动装箱.所以int也可以
Object result = addMethod.invoke(invokeTester, new Object[] {
new Integer(100), 400 });
System.out.println(result.toString());
/**
* 同理
*/
Method echoMethod = classType.getMethod("echo",
new Class[] { String.class });
Object object = echoMethod.invoke(invokeTester, "Hello");
System.out.println(object.toString());
}
}
jkd提供了invoke方法调用对象的方法
[color=red]在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法[/color]
如果想反射一个类。那么必须知道他的类类型。也就是class object
一共有如下几种方法
1)getClass() //String str="aaa";
//Class c=str.getClass();
2)静态方法
Class.forName(); //Class c=Class.forName("java.lang.String");
3).class语法 //Class c=String.class
4)原声数据类型的type语法 //Boolean.TYPE
5)getSupperclass //String str="aaa";
//Class c=str.getSuperclass(); 得到的是object类的类型