java类反射技术

还没找工作,压力挺大,闲来谈谈类反射技术,这些技术用到哪些方面呢,比如我们用到的框架包括测试包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 {
	
	@Test
	public void study(){
		
		System.out.println("上课睡觉");
	}
	
	@Test
	public void sleep(){
		
		System.out.println("玩手机");
	}
	
	@Test
	public 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方法根据注解类型找到方法对应的注解,如果找到返回注解,没找到返回null
			Object ann=method.getAnnotation(Test.class);
			//判断注解为不为空,不为空执行该类对象的方法
			if(ann!=null){
				method.invoke(obj);
			}
		}
		
	}

}
下面测试项目目录和测试结果,本来写反射要捕获很多异常,我这里主要不研究异常,所以全抛了。当我写博客时真的发现压力很大,对自己能力不知道怎样评估。 吐舌头大概是因为我很帅,写代码也很帅,不说了看图:



再来一张:


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

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





猜你喜欢

转载自blog.csdn.net/lkwan123/article/details/75671455
今日推荐