Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
Java 反射机制主要提供了以下功能:
1. 在运行时判断任意一个对象所属的类
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private 方法)
4. 在运行时调用任意一个对象的方法(***** 注意:前提都是在运行时,而不是在编译时)
Java 反射相关的API 简介:
位于java.lang.reflect 包中
--Class 类:代表一个类
--Filed 类:代表类的成员变量
--Method 类:代表类的方法
--Constructor 类:代表类的构造方法
--Array 类:提供了动态创建数组,以及访问数组的元素的静态方法, 该类中的所有方法都是静态方法
例子:
package TestReflection;
import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class TestClass
{
public int number ;
private String str ;
public TestClass()
{
number = 0;
str = "" ;
}
public TestClass(String str, int number)
{
this . number = number;
this . str = str;
}
public void setNumber( int number)
{
this . number = number;
}
public void setString(String str)
{
this . str = str;
}
public int getNumber()
{
return number ;
}
public String getString()
{
return str ;
}
public String toString()
{
return str + " " + number ;
}
}
public class TestReflection
{
public static void main(String[] args)
{
try
{
Class c = Class.forName ( "TestReflection.TestClass" );
/// 对 objNO 对象使用默认构造函数
Object objNo = (TestClass)c.newInstance();
System. out .println(objNo);
// 设置参数类型
Class[] params = new Class[2];
params[0] = String. class ;
params[1] = Integer. TYPE ;
// 获得带参构造函数
Constructor constructor = c.getConstructor(params);
// 设置参数
Object[] objects = new Object[2];
objects[0] = "Hello" ;
objects[1] = new Integer(100);
/// 对 objHave 对象使用带参构造函数
Object objHave = constructor.newInstance(objects);
System. out .println(objHave);
// 设置参数类型
Class[] paramStr = {String. class };
// 获得参数
Method setMethod = c.getMethod( "setString" , paramStr);
// 设置参数
Object obj = "SetMethod" ;
/// 对 objNo 对象使用方法
setMethod.invoke(objNo, obj);
System. out .println(objNo);
/// 修改私有成员值
Field testStr = c.getDeclaredField( "str" );
testStr.setAccessible( true );
testStr.set(objHave, "world" );
/// 修改公有成员值
Field testNumber = c.getField( "number" );
testNumber.setInt(objHave, 200);
System. out .println(objHave);
}
catch (ClassNotFoundException e)
{
System. out .println( "Exceptoin: No Class" );
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
System. out .println( "Exceptoin: No Method" );
}
catch (NoSuchFieldException e)
{
System. out .println( "Exceptoin: No Field" );
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
}
}
推荐网站:好巴鹿(http:// www.haobalu.com )