2、JAVA反射机制简介
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
Java 反射机制主要提供了以下功能:
* 在运行时判断任意一个对象所属的类。
* 在运行时构造任意一个类的对象。
* 在运行时判断任意一个类所具有的成员变量和方法。
* 在运行时调用任意一个对象的方法。
反射是Java被视为动态(或准动态)语言的一个关键性质。
3、进入代码
我一贯认为,概念大致了解就行,关键是会用!毕竟我们是开发工程师(说的好听点,不能自己埋汰自己)!来,看下面的代码吧(记得写代码一定要加上注释啊,这才是关键):
package com.majun.ref;
public class Test extends SuperTest implements Interface1, Interface2
{
public String name;
public Test(){
}
public Test(String s1, String s2){
}
public void print(String msg){
}
public int add(int a, int b)
{
return a + b;
}
}
Test只是个为了演示而写的一个准备类,有接口实现,有超类继承,有属性,有方法!这里代码没有完全给出,也不需要详细介绍了!,下面这个类才是真正演示反射的:
package com.majun.ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
Class<?> classType = Class.forName("com.majun.ref.Test");
//获取属性(getFields只能获取public类型的属性,getDeclaredFields可以获取所有属性)
//(下同,注意Declared修饰词)
Field[] fs = classType.getFields();?//.getDeclaredFields();?
for(Field f : fs)
{
System.out.println(f.getName());
}
//获取指定的属性
Field f = classType.getDeclaredField("name");//.getField("name");
System.out.println(f.toString());
//获取构造函数
Constructor<?>[] cs = classType.getDeclaredConstructors();//.getConstructors();
for(Constructor<?> c : cs)
{
System.out.println(c.toString());
}
//获取指定参数类型的构造函数
Constructor<?> c = classType.getConstructor(java.lang.String.class, java.lang.String.class);//.getDeclaredConstructor(java.lang.String.class);
System.out.println(c.toString());
?
//获取直接实现的接口
Type[] ts = classType.getGenericInterfaces();
for(Type t : ts)
{
System.out.println(t.toString());
}
//获取直接继承的超类
Type t = classType.getGenericSuperclass();
System.out.println(t.toString());
//获取方法
Method[] ms = classType.getDeclaredMethods();//.getMethods();
for(Method m : ms)
{
System.out.println(m.toString());
}
//获取指定的方法
Method m = classType.getMethod("print", new Class[]{String.class});
System.out.println(m.toString());
//方法调用
Object invoker = classType.newInstance();
Method md = classType.getMethod("add", new Class[]{int.class, int.class});
Object obj = md.invoke(invoker, new Object[]{new Integer(19), new Integer(65)});
System.out.println((Integer)obj);
}
}
4、哈哈
通过上面的学习,我们应该对Java放射机制有了一个大致的了解了,对于其他一些常用的应用,比如运行时复制对象、运行时改变属性内容、动态创建数组等,这里不再演示!