java类反射技术

来源:互联网 发布:数字抽奖软件在线 编辑:程序博客网 时间:2024/06/06 02:52

还没找工作,压力挺大,闲来谈谈类反射技术,这些技术用到哪些方面呢,比如我们用到的框架包括测试包Junit都是根据java类反射技术写的,我这次写几个小案例剖析一下类反射技术的基础。我模拟一下junit3和junit4的原型,程序里详细注释

package mapper;import java.lang.reflect.Method;import java.util.List;import java.util.Scanner;/** * junit3原型 * @author lenovo * */public class Junit3 {public static void main(String[] args)throws Exception {//这里没有配置文件,先用Scanner类从控制台输入Scanner sc=new Scanner(System.in);System.out.println("输入类名:");//接收类名String className=sc.nextLine();//通过类名动态加载这个类Class cla=Class.forName(className);//通过这个类对象创建这个类实体对象Object obj=cla.newInstance();//获取这个类的全部方法,每个方法都是一个method对象Method[] methods=cla.getDeclaredMethods();//遍历这个方法对象数组,默认方法都是无参数for(Method method:methods){//通过getName方法获取方法名String name=method.getName();//判断方法名前缀是否为test,如果是执行这个方法if(name.startsWith("test")){method.invoke(obj);}}}}
junit3原型没做测试类,用的java.lang.String做的测试图片就不发了,我详细讲解junit4的原型,基本思路:

1.根据类名加载这个类,通过一个类对象接收加载的这个类。

2.获取这个类的所有方法,通过Class提供方法为这个类创建一个对象,用object接收。

3.遍历这个方法对象数组,对于每一个方法判断有没有Test注解。

4.有注解的method.invoke(obj);意思为执行这个方法

自己编写一个Test注解:

package mapper;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)/** * 定义Test注解 * @author lenovo * */public @interface Test {}

写一个测试类:

package mapper;/** * student类做为测试类 * @author lenovo * */public class Student {@Testpublic void study(){System.out.println("上课睡觉");}@Testpublic void sleep(){System.out.println("玩手机");}@Testpublic void playPhone(){System.out.println("泡妹子");}public void graduate() {System.out.println("找不到工作");}}

下来就是重头戏junit4原型,但是你会发现和junit3很像偷笑

package mapper;import java.lang.reflect.Method;import java.util.Scanner;public class Junit4 {public static void main(String[] args)throws Exception{//这里没有配置文件,先用Scanner类从控制台输入Scanner sc=new Scanner(System.in);System.out.println("请输入类名:");//接收类名String className=sc.nextLine();//通过类名动态加载这个类Class cla=Class.forName(className);//通过这个类对象创建这个类实体对象Object obj=cla.newInstance();//获取这个类的全部方法,每个方法都是一个method对象Method [] methods=cla.getDeclaredMethods();//遍历这个方法对象数组,默认方法都是无参数for(Method method:methods){//用object对象接收注解对象,getAnnotation方法根据注解类型找到方法对应的注解,如果找到返回注解,没找到返回nullObject ann=method.getAnnotation(Test.class);//判断注解为不为空,不为空执行该类对象的方法if(ann!=null){method.invoke(obj);}}}}
下面测试项目目录和测试结果,本来写反射要捕获很多异常,我这里主要不研究异常,所以全抛了。当我写博客时真的发现压力很大,对自己能力不知道怎样评估。吐舌头大概是因为我很帅,写代码也很帅,不说了看图:



再来一张:


我的大学马上结束了哭生气,听一首<小小思念>

干枯的树杈  开着白的花
树下的人儿  抬头望着它
孤单的唱着  那一句情话
遥远地方的他 数不清牵挂
被你牵过的手 温度依然残留
多少美丽的梦 在这里守候
冬风陪伴晚霞 染红那片天空
小小人儿心中 渴望着温柔
那首你写的歌 我依然能弹奏
直到我们白头 随它成河流
明年这个时候 别湿了你眼眸
等那一束光  幻化成希望
干枯的树杈  开着白的花
树下的人儿  抬头望着它
孤单的唱着  那一句情话
遥远地方的他 数不清牵挂
被你牵过的手 温度依然残留
多少美丽的梦 在这里守候
冬风陪伴晚霞 染红那片天空
小小人儿心中 渴望着温柔
那首你写的歌 我依然能弹奏
直到我们白头 随它成河流
明年这个时候 别湿了你眼眸
等那一束光 幻化成希望
被你牵过的手 温度依然残留
多少美丽的梦 在这里守候
冬风陪伴晚霞 染红那片天空
小小人儿心中 渴望着温柔
那首你写的歌 我依然能弹奏
直到我们白头 随它成河流
明年这个时候 别湿了你眼眸
等那一束光 幻化成希望





原创粉丝点击