`
LynBazinga
  • 浏览: 11103 次
社区版块
存档分类
最新评论

java反射基本知识和应用

阅读更多

在最近的项目中,在Coding阶段,发现很多代码冗余,代码质量很差,故此研究了一下java的反射,有什么错,请各位大神指出纠正

数据准备:

Person类

public class Person {
	
	private String sex;
	
	private String personId;

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getPersonId() {
		return personId;
	}

	public void setPersonId(String personId) {
		this.personId = personId;
	}

}

 Student类

public class Student extends Person {
	
	public String username;
	
	private int age;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}
	
	private float chineseClz;
	
	private float physicalClz;
	
	private float englishClz;
	
	private float historyClz;
	
	
	
    public String getUsername() {
		return username;
	}



	public void setUsername(String username) {
		this.username = username;
	}



	public int getAge() {
		return age;
	}



	public void setAge(int age) {
		this.age = age;
	}



	public float getChineseClz() {
		return chineseClz;
	}



	public void setChineseClz(float chineseClz) {
		this.chineseClz = chineseClz;
	}



	public float getPhysicalClz() {
		return physicalClz;
	}



	public void setPhysicalClz(float physicalClz) {
		this.physicalClz = physicalClz;
	}



	public float getEnglishClz() {
		return englishClz;
	}



	public void setEnglishClz(float englishClz) {
		this.englishClz = englishClz;
	}



	public float getHistoryClz() {
		return historyClz;
	}



	public void setHistoryClz(float historyClz) {
		this.historyClz = historyClz;
	}



	@SuppressWarnings("unused")
	private int getTotal(int a,int b,int c,int d){
    	return a+b+c+d;
    }

	@Override
	public String toString() {
		return "Student [username=" + username + ", age=" + age
				+ ", chineseClz=" + chineseClz + ", physicalClz=" + physicalClz
				+ ", englishClz=" + englishClz + ", historyClz=" + historyClz
				+ "]";
	}
	
}

 测试类(需要junit.jar)

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
	
	/**
	 * 获取该类所有的公开方法名
	 */
	@org.junit.Test
	public void test(){
		Class<Student> c=Student.class;
		//获取该class和该class父类所有的公开方法
		Method[] methods=c.getMethods();
		for(Method m:methods){
			/*System.out.println(m);*/
			System.out.println(m.toString());
		}
	}
	
	/**
	 * 获取该类所有的方法名包括[private]
	 */
	@org.junit.Test
	public void test1(){
		Class<Student> c=Student.class;
		//获取该class的所有方法
		Method[] methods=c.getDeclaredMethods();
		for(Method m:methods){
			/*System.out.println(m);*/
			System.out.println(m.toString());
		}
	}
	
	/**
	 * 反射创建对象
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	@org.junit.Test
	public void test2() throws InstantiationException, IllegalAccessException{
		Class<Student> c=Student.class;
		Student stu=(Student)c.newInstance();
		stu.setUsername("Lyncc");
		stu.setAge(11);
		System.out.println(stu.toString());
	}
	
	/**
	 * 获取类中的属性变量
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	@org.junit.Test
	public void test3() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
		Student student=new Student();
		Class<Student> c=Student.class;
		Field usernamField=c.getField("username");
		usernamField.set(student, "Lyncc");
		System.out.println(student.toString());
	}
	
	/**
	 * 获取值
	 * @throws NoSuchFieldException
	 * @throws SecurityException
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	@org.junit.Test
	public void test4() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
		Student student=new Student();
		student.setUsername("Lyncc");
		student.setAge(21);
		Class<Student> c=Student.class;
		Field f=c.getDeclaredField("age");
		//private属性必须加
		f.setAccessible(true);
		Object obj=f.get(student);
		System.out.println(obj);
	}
	
	
	/**
	 * 获取该类的制定方法
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 * @throws NumberFormatException 
	 */
	@org.junit.Test
	public void test5() throws NoSuchMethodException, SecurityException, NumberFormatException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		Student student=new Student();
		Class<Student> c=Student.class;
		Method m=c.getDeclaredMethod("getTotal", new Class[]{int.class,int.class,int.class,int.class});
		m.setAccessible(true);
		Object result=m.invoke(student,new Object[]{new Integer(100),new Integer(100),new Integer(100),new Integer(100)}); 
	    System.out.println(result);
	}
	
	
	/**
	 * 综合实例
	 * 场景:
	 * 前台提交一个表单,例如学生的各科成绩,后台验证数据合理性的时候必须0<getChineseClz<100
	 * 0<getEnglishClz<100等等,如果有一个学生有10门课就必须写10次if的判断,代码很冗余
	 */
	@org.junit.Test
	public void test6() throws NoSuchMethodException, SecurityException, NumberFormatException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		//测试数据
		Student student=new Student();
		student.setChineseClz(97.0f);
		student.setEnglishClz(96.0f);
		student.setHistoryClz(98.5f);
		student.setPhysicalClz(95.4f);
		//传统做法
		/*if(student.getChineseClz()!=0.0f){
			validation(student.getChineseClz());
		}
		if(student.getEnglishClz()!=0.0f){
			validation(student.getEnglishClz());
		}
		if(student.getHistoryClz()!=0.0f){
			validation(student.getHistoryClz());
		}
		if(student.getPhysicalClz()!=0.0f){
			validation(student.getPhysicalClz());
		}*/
		//TODO
		//to do other things
		//反射做法
		Class<Student> c=Student.class;
		Method[] stuMethods=c.getDeclaredMethods();
			for(Method m:stuMethods){
				if(m.toString().indexOf("Clz")>-1&&m.toString().indexOf("get")>-1){
					Object result=m.invoke(student);
					if(validation((float)result)){
						System.out.println("可以保存到数据库");
						//TODO
						//saveDataToDataBase();
					}
				}
			}
	}
	 
	  private boolean validation(float point){
	    	if(0.0f<point&&point<100.0f){
	    		System.out.println("数据正确");
	    		return true;
	    	}else{
	    		System.out.println("数据错误");
	    		return false;
	    	}
	    }

}

 希望有能帮助到大家的地方,谢谢,有什么不对的可鞭策

 

分享到:
评论
1 楼 yongfahuang 2014-11-10  
写的很好,例子也很多,学习了

相关推荐

    java反射知识点

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我的代码里主要有一下知识点: 1.获取Class对象的三种方式 2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射...

    Java反射技术综合应用(同时包括一些IO 和 图形化界面知识)

    利用Java反射、IO、图形化技术相结合实现的一个类搜索小工具,可以直观的看到效果,代码不多,注释齐全,适合初阶段学习。

    详解Java 反射和反射的应用场景

    主要介绍了Java 反射和反射的应用场景的相关资料,帮助大家更好的理解和学习Java反射的相关知识,感兴趣的朋友可以了解下

    反射实例-JAVA反射机制.doc

    反射实例-JAVA反射机制,基本知识介绍和简单的应用

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第...

    Java基础 反射篇.md

    反射是一个非常重要的知识点,在学习Spring 框架时,Bean的初始化用到了反射,在破坏单例模式时也用到了反射,在获取标注的注解时也会用到反射······ 当然了,反射在日常开发中,我们没碰到过多少,至少我没...

    Java反射基础入门,一篇就够啦

    文章目录Java基础之反射1 前言2 反射的基本概念3 reflection的工作机制4 构造Class对象方式5 Java反射机制操作的基础套路5.1 Java中的类反射5.2 Java反射机制获取类中构造方法的信息5.3 获取类中方法的信息6 Java...

    java反射机制

    jiav反射机制应用小程序和java反射机制小知识

    Java反射机制详解

    主要介绍了Java反射机制,首先简单介绍了反射机制的预备知识,进一步分析了Java反射机制的原理、实现技巧与应用方法,需要的朋友可以参考下

    反射处理java泛型

     本文假设你已经了解java反射知识,并能熟练的应用。如果还不了解java反射知识,那么你可以先移步到Oracel反射课程,这可能是你开始学习反射的好起点.  ReflectionUtil中包含以下几种功能:  通过Type获取对象...

    JAVA反射的详解以及使用方法

    介绍了反射的作用、如何进行反射,Class对象反射构造器、反射方法、反射属性以及实例应用。浓缩精简版、适合初学反射或者复习相关知识。

    完整版 Java高级教程 Java语言程序设计 第7章 Java注解(共10页).ppt

    完整版 Java高级教程 Java语言程序设计 第5章 Java反射(共9页).ppt 完整版 Java高级教程 Java语言程序设计 第6章 常用设计模式(共25页).ppt 完整版 Java高级教程 Java语言程序设计 第7章 Java注解(共10页).ppt...

    Java核心技术 第12版 开发基础+高级特性 英文原版

    本书不仅让你深入了解设计和实现 Java 应用涉及的所有基础知识和 Java 特性,还会帮助你掌握开发 Java 程序所需的全部基本技能。相信在学习Java的道路上有了本书的辅助,你的学习一定可以做到事半功倍。 作者简介 ·...

    java高级编程知识+理论知识+实际案例

    3、知识领域3 Java反射机制的应用 4、知识领域4 Java泛型机制的应用 5、知识领域5 Java序列化机制的应用 6、知识领域6 Java多线程机制的应用 7、知识领域7 Java网络编程的应用 8、知识领域8 Java数据库编程的应用 9...

    完整版 Java高级教程 Java语言程序设计 第8章 JDBC(共24页).ppt

    完整版 Java高级教程 Java语言程序设计 第5章 Java反射(共9页).ppt 完整版 Java高级教程 Java语言程序设计 第6章 常用设计模式(共25页).ppt 完整版 Java高级教程 Java语言程序设计 第7章 Java注解(共10页).ppt...

    Java的关键知识点

    想成为JAVA高手,至少要非常熟悉并能自如地应用这四个知识点:序列化机制、RTTI机制、CALLBACK机制、反射机制。本文将为大家详细介绍Java的关键知识点。

    反射在实际开发中的应用

    本段代码是在学习了反射相关知识后,结合实际开发经验,以一个简单demo讲述开发中是如何利用发射进行开发。 主要包含以下三个知识点:1.以tomcat为例,讲述其基于反射运行的原理。2. 反射的三种实现方式--获取字节码...

    编程实践:Java进阶100例

    编者结合自己多年来在Java研发和技术指导岗位上的经验,总结和汲取Java最核心的技术和能力,为广大Java爱好者提供更好的系统学习Java知识的方法和方向。 目录: 第一章:Java入门; 第二章:MyEclipse的基本...

    Java高级面试题整理及答案.md

    资源介绍: Java高级面试题整理及答案.md 是一个汇集了Java...初学者:对于刚刚接触Java的初学者来说,该资源可以帮助他们更好地了解Java的基础知识和核心概念,为后续的学习和实践打下基础。 场景目标: 提高面试

Global site tag (gtag.js) - Google Analytics