当前位置: 首页 > 科技观察

Java高级特性总结反思学习

时间:2023-03-15 00:20:48 科技观察

老规矩先问几个问题。一项技术必须能够解决某些问题,才值得学习和掌握。1、什么是反射?2.反射可以做什么What?1、什么是反射?在Java中使用,意味着我们可以在运行时加载、检测和使用在编译过程中完全未知的类。也就是说,一个Java程序可以加载一个名字只在运行时才知道的类,学习它的完整结构(但不包括方法定义),并生成它的对象实体,或者为其字段设置值,或者调用它的方法.如果你是AndroidDeveloper,前辈教你尽量少用反射,效率太低,太慢。“射”嘛,射得太快也不好,所以虽然反射慢了点,但偶尔射一下还是很“爽”的。2.反射能做什么?1.新建类的实例我们知道,所有的类都继承自子***父类Object,而Object有hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class对象。这里我们需要用到的Class对象,注意C是大写的,我们可以通过以下方式获取Class对象Class.forName("类名字符串")(注意:类名字符串必须是全名,包名+类名)类名.类实例object.getClass()在Class类中有一个很重要的方法publicTnewInstance()throwsInstantiationException,IllegalAccessException{returnnewInstanceImpl();}privatenativeTnewInstanceImpl()throwsIllegalAccessException,InstantiationException;查看Api可以看到调用newInstace方法可以返回当前类对应的实例对象。接下来看一个小DemopublicclassReflection{publicstaticvoidmain(String[]args){//普通创建类的实例Peoplep1=newPeople();System.out.println(p1.getName());//使用反射获取实例classesClassclazz=People.class;//常用方法,注意括号中类的全路径名//Classclazz=Class.forName("reflection.People");//Classclazz=p1.getClass();try{Peoplep2=(People)clazz.newInstance();System.out.println(p2.getName());}catch(Exceptione){e.printStackTrace();}}}classPeople{privateStringname="张三";privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}输入结果:张三张三2.获取成员变量和方法在讲方法之前,先看这么一个小推理,JSON数据到JavaBaen对象,在不使用解析库的情况下,一般我们会做这个privatevoidanalysisDate(JSONObjectresponse)throwsJSONException{intannounceid=response.getInt("announceid");Stringtitle=response.getString("title");Stringhits=response.getString("hits");Stringaddtime=response.getString("addtime");NewsNotifyItemnewsNotifyItem=newNewsNotifyItem(announceid,title,hits,addtime);}}每当我们需要分析金额的时候,就需要根据不同的javabean来分析。我们每次执行的操作都是一样的,只是分析的数据不一样。就这些,结合上篇文章提到的泛型,这里我们可以利用反射自己做一个Json解析工具下面是我写的一个JsonObject对象转JavaBean的工具类。需要注意的是JSON的key需要和字段名保持一致。先说一下思路吧。首先通过反射获取JavaBean中所有字段值的名称。②拼接出set方法③由于字段名与Json的key值相同,所以使用自动名获取Json中的值,填充到实例对象中publicclassJson2BeanUtils{publicstaticTjsonToBean(JSONObjectresponse,Classclazz){try{//创建类InstanceObjectobject=Class.forName(clazz.getName()).newInstance();//获取类中的所有成员变量Field[]fields=object.getClass().getDeclaredFields();for(inti=0;i