当前位置: 首页 > news >正文

机关网站建设需求文档东莞大朗网络推广外包

机关网站建设需求文档,东莞大朗网络推广外包,站酷网官网登录,wordpress $ order点击数我们应用会用到反射这个知识点#xff0c;肯定是想要在运行时得到类的信息#xff0c;根据类的那些信息去做一些特定的操作。那么#xff0c;首先无疑就是得到类的信息#xff0c;在JDK中提供了Class对象来保存类的信息。所以#xff0c;反射的第一步就是得到Class对象。在… 我们应用会用到反射这个知识点肯定是想要在运行时得到类的信息根据类的那些信息去做一些特定的操作。那么首先无疑就是得到类的信息在JDK中提供了Class对象来保存类的信息。所以反射的第一步就是得到Class对象。在JDK中提供了两种方式得到Class对象。第一种如果编写代码的时候就知道Class的名字可以直接用如下方式得到Class对象 //第一种如果编写代码的时候就知道Class的名字可以直接用如下方式得到Class对象Class exampleObjectClass ExampleObject.class;//第二种如果在编写代码的时候不知道类的名字但是在运行时的时候可以得到一个类名的字符串可以用如下的方式获取Class对象//注意此方法需要有2个条件第一forName中的字符串必须是全限定名第二//这个Class类必须在classpath的路径下面因为该方法会抛出ClassNotFoundException的异常。Class exampleObjectClass2 Class.forName(com.team.frame.fanshe.ExampleObject); 下面介绍通过反射可以获取那些信息1. 得到类的名字 /*** 得到类的名字* 类的名字有两种方式得到一种是getName()一种是getSimpleName()。* 第一种得到的是全限定名第二种得到的是这个类的名字不带包名。看下面的例子Class对象已经通过上面的代码得到了。*/String fullClassName exampleObjectClass.getName();String simpleClassName exampleObjectClass.getSimpleName();System.out.println(fullClassName);System.out.println(simpleClassName);2. 得到类的包名、父类和实现的接口 //得到包信息Package aPackage exampleObjectClass.getPackage();System.out.println(aPackage);//得到父类Class superClass exampleObjectClass.getSuperclass();System.out.println(superClass.getSimpleName());//判断父类是否是抽象类boolean abstract1 Modifier.isAbstract(superClass.getModifiers());//我们还可以得到父类实现的接口Class[] interfaces superClass.getInterfaces();System.out.println(父类的接口 interfaces[0]);3. 利用Java反射可以得到一个类的构造器并根据构造器在运行时动态的创建一个对象 Constructor[] constructors exampleObjectClass.getConstructors();for(Constructor cos:constructors){System.out.println(cos.toString());}//如果事先知道要访问的构造方法的参数类型可以利用如下方法获取指定的构造方法例子如下Constructor constructor exampleObjectClass.getConstructor(String.class);System.out.println(constructor);//此外如果我们不知道构造器的参数只能得到所有的构造器对象那么可以用如下方式得到每一个构造器对想的参数Constructor[] constructors2 exampleObjectClass.getConstructors();for(Constructor cos2:constructors2){Class[] parameterTypes cos2.getParameterTypes();for(Class cla:parameterTypes){System.out.println(参数类型cla.toString());}}//根据构造器创建一个对象//这个创建对象的方式有2个条件第一是通过有参构造器创建的第二构造器对象必须通过传入参数信息的getConstructor得到。//第一个条件对于无参构造方法就可以创建的对象不需要得到构造器对象直接Class对象调用newInstance()方法就直接创建对象。//第二个条件构造器对象必须通过exampleObjectClass.getConstructor(String.class);这种形式得到。如果通过getConstructors得到构造器数组//然后调用指定的构造器对象去创建对象在JDK1.8是会错的。但是JDK1.6是正常的Constructor constructor2 exampleObjectClass.getConstructor(int.class,Integer.class);Object newInstance constructor2.newInstance(1,100);System.out.println(newInstance.toString());4. 利用Java反射可以在运行时得到一个类的变量信息 /*** 变量* 利用Java反射可以在运行时得到一个类的变量信息并且可以根据上面讲的方式创建一个对象设置他的变量值。首先通过如下方法得到所有public的变量*/Field[] fields exampleObjectClass.getFields();for(Field fi:fields){System.out.println(变量为fi.toString());}//和构造器一样的得到方式一样我们可以指定一个参数名然后得到指定的变量Field field exampleObjectClass.getField(age);System.out.println(field.toString());//更改变量的值Constructor constructor1 exampleObjectClass.getConstructor(String.class);ExampleObject newInstance2 (ExampleObject)constructor1.newInstance(heihei);System.out.println(原来的agenewInstance2.getAge());field.set(newInstance2, 10);System.out.println(修改后agenewInstance2.getAge());5. Java反射给我们除了给我们提供类的变量信息之外当然也给我们提供了方法的信息 /*** 方法* Java反射给我们除了给我们提供类的变量信息之外当然也给我们提供了方法的信息* 反射可以让我们得到方法名方法的参数方法的返回类型以及调用方法等功能。*/Method[] methods exampleObjectClass.getMethods();for(Method me:methods){System.out.println(methodme.getName());}//根据参数获得具体方法Method method exampleObjectClass.getMethod(setAge, int.class);System.out.println(method.getName());//获取方法的参数类型Class?[] parameterTypes method.getParameterTypes();for(Class clz:parameterTypes){System.out.println(参数名clz.getName());System.out.println(类型clz.getTypeParameters());}//获得方法返回类型的Class? returnType method.getReturnType();//此外Java反射支持通过invoke调用得到的方法。例子如下//nvoke第一个参数是这个对象第二个参数是变长数组传入该方法的参数。和Field对象同样对于静态方法同样可以传入null调用静态方法。method.invoke(exampleObjectClass.newInstance(), 1);6. Java给我们提供了在运行时获取类的注解信息可以得到类注解方法注解参数注解变量注解 /*** 注解* Java给我们提供了在运行时获取类的注解信息可以得到类注解方法注解参数注解变量注解。* 与上面获取方式一样Java提供了2种获取方式一种是获取全部的注解返回一个数组第二种是指定得到指定的注解。* 我们以一个类注解为例讲解以下这两种获取方式。*///获取类上的注解Class clz AnnotationObject.class;Annotation[] annotations clz.getAnnotations();Annotation annotation clz.getAnnotation(AnnotationObject.class);//根据注解进行后续处理for(Annotation ano:annotations){if(ano instanceof MyAnnotationFanshe){MyAnnotationFanshe annoFanshe(MyAnnotationFanshe)ano;System.out.println(annoFanshe.name());System.out.println(annoFanshe.value());}}//获取参数上的注解Method method2 clz.getMethod(doOtherThing,String.class);Class[] params method2.getParameterTypes();Annotation[][] annotationInParam method2.getParameterAnnotations();int i 0;for (Annotation[] annos: annotationInParam){Class para params[i];for (Annotation anno : annotations){if(annotation instanceof MyAnnotationFanshe){MyAnnotationFanshe myAnnotation (MyAnnotationFanshe) annotation;System.out.println(param: para.getName());System.out.println(name : myAnnotation.name());System.out.println(value : myAnnotation.value());}}}7. 获取泛型 /*** 泛型* 因为Java泛型是通过擦除来实现的很难直接得到泛型具体的参数化类型的信息* 但是我们可以通过一种间接的形式利用反射得到泛型信息。比如下面这个类* 如果一个方法返回一个泛型类我们可以通过method对象去调用getGenericReturnType来得到这个泛型类具体的参数化类型是什么。*/Class generObject GenericObject.class;//反射得到返回类型为泛型类的方法Method method3 generObject.getMethod(getLists);//调用getGenericReturnType得到方法返回类型中的参数化类型Type genericType method3.getGenericReturnType();//判断该type对象能不能向下转型为ParameterizedTypeif(genericType instanceof ParameterizedType){//转型成功调用getActualTypeArguments得到参数化类型的数组因为有的泛型类不只只有一个参数化类型如MapKVParameterizedType parameterizedType ((ParameterizedType) genericType);//取出数组中的每一个的值转型为Class对象输出Type[] types parameterizedType.getActualTypeArguments();for (Type type : types){Class actualClz ((Class) type);System.out.println(参数化类型为 actualClz);}}//因为方法的参数为泛型类型的可能不止一个所以通过getGenericParameterTypes得到是一个数组//我们需要确定每一个元素是否是具有参数化类型。后续的步骤与上面类似就不多说了。//如果连方法参数都不带泛型类那么只剩下最后一种情况通过变量类型即用Field类。例子如下Field field1 generObject.getField(lists);Type type field1.getGenericType();if (type instanceof ParameterizedType){ParameterizedType parameterizedType ((ParameterizedType) type);Type [] types parameterizedType.getActualTypeArguments();for (Type type1 : types) {System.out.println(参数化类型 ((Class) type1).getTypeName());}}8. Java反射可以对数组进行操作 /*** 数组* Java反射可以对数组进行操作包括创建一个数组访问数组中的值以及得到一个数组的Class对象。* 下面先说简单的创建数组以及访问数组中的值在反射中使用Array这个类是reflect包下面的。*///创建一个int类型的数组长度为3int[] intArray (int[])Array.newInstance(int.class, 3);//通过反射形式给数组赋值for(int a0;aintArray.length;a){Array.set(intArray, a, a2);}//通过反射形式获取数组中的值for(int b0;bintArray.length;b){Array.get(intArray, b);}//上述就是创建数组访问数组中的值利用反射方式//对于得到一个数组的Class对象简单的可以用int[].class或者利用Class.forName的形式得到写法比较奇怪Class clz2 Class.forName([I);System.out.println(clz2.getTypeName());//这个forName中的字符串[表示是数组I表示是intfloat就是Fdouble就是D等等如果要得到一个普通对象的数组Class stringClz Class.forName([Ljava.lang.String;);//[表示是数组,L的右边是类名类型的右边是一个//这种方式获取数组的Class对象实在是太繁琐了。//在得到数组的Class对象之后就可以调用他的一些独特的方法比如调用getComponentType来得到数组成员的类型信息如int数组就//是成员类型就是int。System.out.println(clz2.getComponentType().getTypeName());
http://www.pierceye.com/news/119165/

相关文章:

  • 网页设计基础学什么seochan是什么意思
  • 汽车网站网页设计设计师网站推荐家装
  • 游戏交易网站怎么做wordpress 分词
  • 网站难做吗建设企业网站的需求
  • 网站开发设计文档模板wordpress5.2下载
  • 网站备案后要做什么wordpress 黑色
  • 池州建设机械网站中国房地产100强名单
  • 怎么在虚拟主机上建网站wordpress 更新feed
  • 内设网站wordpress 注册验证
  • 全景网站建设做米业的企业网站
  • 珠海哪个建设网站建设好ui网站界面设计
  • 中国有名的模版网站电商建设网站
  • 网站改域名合肥网站建设企业
  • 建网站需要软件c 怎么做能让窗体访问网站
  • 呼家楼网站建设黄骅市官方网站
  • 空包网站分站怎么做手表网站哪个最好知乎
  • 手机商城建站系统网站建设有关建筑网站建设方案
  • 做网站需要具备的基础条件wordpress 修改后台
  • 网站做点击收费标准重庆建设工业集团
  • wordpress个人网站备案管理广州网站搭建费用
  • 英文网站建设的原因泰安房产信息网网签查询
  • 怎么将网站做成html如何寻找一批做网站的公司
  • 苏州网站建设孙峰南宁站建站时间
  • 海淀手机网站设计公司苏州建设工程有限公司
  • 兰州网站设计制作王妃貌美还狠凶
  • 做新闻微网站有哪些淘宝优惠劵做网站模版
  • 网站维护的意义百度一下官网首页百度
  • 我是做网站怎么赚钱外贸网站google推广
  • 无锡网站seo报价软件开发模型是对软件开发过程的一种规范描述
  • 暴利产品竞价单页网站微信电商小程序开发公司