example反射(java)

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放射机制有了一个大致的了解了,对于其他一些常用的应用,比如运行时复制对象、运行时改变属性内容、动态创建数组等,这里不再演示!

posted @ 2012-08-18 09:32  feifeihu  阅读(305)  评论(0编辑  收藏  举报