反射的理解和使用

来源:互联网 发布:吉林省网络教育jlsedu 编辑:程序博客网 时间:2024/06/07 01:19

   我对反射也不太清楚,写这篇博客就是为了记录自己的想法       

首先给出百度百科的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

通常情况下,我们调用一个类时,都要导入一个包,通过反射就不需要导入包(这样的理解可能是错的)

老师给出的概念:

1)     构建与运行类对象,采用参数方法进行,这个类可能是一个普通的二进制文件,可能是任何地方

2)     反射是构建java高级技术的手段

从老师的概念可以看出来,反射主要采用参数的方式构建和运行类对象,而不是通过通常的new一个对象,下面给一个实例

建立一个PO类,代码如下

package com.iss.reflect;           //PO类所在的包

public class UserPO {
private Integer userId;
private String name;
public Integer getUserId() {

return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {

this.name = name;
}
}

下面的例子为测试反射的类,代码如下

public class TestReflect {

@Test        //@Test为单元测试,代替主方法
public  void simple() {
Class cls ;      // every class will create a class object, but class is the son of Object,that is to say, all classse extend Object

try {
cls = Class.forName("com.iss.reflect.UserPO");   //通过参数得到该路径下类的类构造器,如果路径错误,会报错

Object o;
try {
o = cls.newInstance();            //通过这个方法会生成一个Object类的对象,类型实际为UserPO


UserPO po=(UserPO) o;         //在通过一次强制转换得到po对象,就可以进行相应的操作属性和方法了

po.setUserId(10026);
Integer userId=po.getUserId();
Log.getLog().info("userId="+userId);  //log4j,代替System.out.print()进行输出调试
po.setName("王海燕");
String name=po.getName();
Log.getLog().info("name="+name);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}




}
//采用复杂反射,运行类对象
@Test
public  void complex2() throws Exception{
Class cls=Class.forName("com.iss.reflect.UserPO");

cls.hashCode();
//通过反射构建类对象
Object o=cls.newInstance();



//采用反射方法运行:po.setUserId(10026);
Method mh1=cls.getMethod("setUserId", Integer.class);      
               //第一个参数为PO里的公共方法的名称,一定不能错,后面为参数的类型,不能省略
 

mh1.invoke(o, 10026);   //第一个参数为PO对象,第二个参数为上面这个set方法的值      

//采用反射方法运行:po.getUserId();

Method mh2=cls.getMethod("getUserId");     //下面依次类推
Integer userId=(Integer) mh2.invoke(o);
Log.getLog().info("userId="+userId);

//采用反射方法运行:po.setName("王海燕");
Method mh3=cls.getMethod("setName", String.class);
mh3.invoke(o, "王海燕");

//采用反射方法运行:po.getName();
Method mh4=cls.getMethod("getName");
String name=(String) mh4.invoke(o);

Log.getLog().info("name="+name);

}
//所有的set方法,均可以用下面统一的方法调用
static void set(Class cls,Object target,String mhName,Class paramType,Object paramValue)
              throws Exception
{
Method mh=cls.getMethod(mhName, paramType);//取得方法运行的结构 
mh.invoke(target, paramValue);//方法回调

}

//所有的get方法,均可以用下面统一的方法调用
static Object get(Class cls,Object target,String mhName)
throws Exception
{
Method mh=cls.getMethod(mhName);//取得方法运行的结构 
Object returnValue=mh.invoke(target);//方法回调
return returnValue;

}

//采用复杂反射,运行类对象
@Test
public  void complex() throws Exception{
Class cls=Class.forName("com.iss.reflect.UserPO");
//通过反射构建类对象
Object o=cls.newInstance();


//采用反射方法运行:po.setUserId(10026);
set(cls,o,"setUserId",Integer.class,10026);

//采用反射方法运行:po.getUserId();

Integer userId=(Integer) get(cls,o,"getUserId");
Log.getLog().info("userId="+userId);

//采用反射方法运行:po.setName("王海燕");
set(cls,o,"setName",String.class,"王海燕");

//采用反射方法运行:po.getName();

String name=(String) get(cls,o,"getName");;

Log.getLog().info("name="+name);

}



}



原创粉丝点击