反射的理解和使用
来源:互联网 发布:吉林省网络教育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);
}
}
- 反射的理解和使用
- java 反射的理解和使用
- 多线程锁和反射的再次理解
- java反射和动态代理的理解
- 反射和注解的使用
- 反射机制的理解
- 反射的简单理解
- C#反射的理解
- 对反射的理解
- Java反射的理解
- 反射的理解
- java 反射的理解
- 反射的简单理解
- 反射的简单理解
- java反射的理解
- 反射的理解总结
- Java 反射的理解
- Java 反射的理解
- python学习:参考
- leetcode 639. Decode Ways II
- 实现杨辉三角
- java NIO详解(3)--FileChannel
- Linux mail命令发送邮件
- 反射的理解和使用
- ios-SDWebImage清除缓存机制
- 全屏滚动的原理及实现
- POJ
- 欢迎使用CSDN-markdown编辑器
- 机器学习概念
- 搭建Android studio开发环境
- 文章标题
- ftpserver(win)