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

网站制作公司广州大连网站制作开发

网站制作公司广州,大连网站制作开发,512内存服务器做网站,电子商务网站建设汇报PPT参考链接#xff1a; Java中的util.Arrays与Reflection.Array的示例 作者#xff1a;火星十一郎 https://www.cnblogs.com/hxsyl 一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private#xff0c;由JVM创建。 反射是java语言的一个特性…参考链接 Java中的util.Arrays与Reflection.Array的示例 作者火星十一郎 https://www.cnblogs.com/hxsyl  一.概念  反射就是把Java的各种成分映射成相应的Java类。  Class类的构造方法是private由JVM创建。  反射是java语言的一个特性它允程序在运行时注意不是编译的时候来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多但是在其它的程序设计语言中根本就不存在这一特性。例如Pascal、C 或者 C 中就没有办法在程序中获得函数定义相关的信息。来自Sun  JavaBean 是 reflection 的实际应用之一它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。  反射是从1.2就有的后面的三大框架都会用到反射机制,涉及到类Class,无法直接new CLass()其对象是内存里的一份字节码.    Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类注释是一种接口。每个数组属于被映射为 Class 对象的一个类所有具有相同元素类型和维数的数组都共享该 Class 对象。  基本的 Java类型boolean、byte、char、short、int、long、float 和 double和关键字 void 也表示为 Class 对象。Class 没有公共构造方法。  Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。  Person p1 new Person();     //下面的这三种方式都可以得到字节码     CLass c1 Date.class();     p1.getClass();      //若存在则加载否则新建,往往使用第三种,类的名字在写源程序时不需要知道到运行时再传递过来     Class.forName(java.lang.String);      Class.forName()字节码已经加载到java虚拟机中去得到字节码java虚拟机中还没有生成字节码 用类加载器进行加载加载的字节码缓冲到虚拟机中。   另外大家可以关注微信公众号Java技术栈回复JVM获取我整理的系列JVM教程都是干货。  考虑下面这个简单的例子让我们看看 reflection 是如何工作的。  import java.lang.reflect.*;       public class DumpMethods {       public static void main(String args[]) {       try {       Class c Class.forName(java.util.Stack);       Method m[] c.getDeclaredMethods();       for (int i 0; i m.length; i)       System.out.println(m[i].toString());       }       catch (Throwable e){       System.err.println(e);       }       }       }     public synchronized java.lang.Object java.util.Stack.pop()      public java.lang.Object java.util.Stack.push(java.lang.Object)      public boolean java.util.Stack.empty()      public synchronized java.lang.Object java.util.Stack.peek()      public synchronized int java.util.Stack.search(java.lang.Object)    这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。这个程序使用 Class.forName 载入指定的类然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。  以下示例使用 Class 对象来显示对象的类名  void printClassName(Object obj) {     System.out.println(The class of obj      is obj.getClass().getName());     }      还可以使用一个类字面值JLS Section 15.8.2来获取指定类型或 void的 Class 对象。例如  System.out.println(The name of class Foo is: Foo.class.getName());     在没有对象实例的时候主要有两种办法。  //获得类类型的两种方式             Class cls1 Role.class;             Class cls2 Class.forName(yui.Role);     注意第二种方式中forName中的参数一定是完整的类名包名类名并且这个方法需要捕获异常。现在得到cls1就可以创建一个Role类的实例了利用Class的newInstance方法相当于调用类的默认的构造器。  Object o cls1.newInstance();      //创建一个实例             //Object o1 new Role();   //与上面的方法等价     二.常用方法    1.isPrimitive(判断是否是基本类型的字节码)  public class TestReflect {     public static void main(String[] args) {     // TODO Auto-generated method stub     String str abc;     Class cls1 str.getClass();     Class cls2 String.class;     Class cls3 null;//必须要加上null     try {     cls3 Class.forName(java.lang.String);     } catch (ClassNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace();     }     System.out.println(cls1cls2);     System.out.println(cls1cls3);     System.out.println(cls1.isPrimitive());     System.out.println(int.class.isPrimitive());//判定指定的 Class 对象是否表示一个基本类型。     System.out.println(int.class Integer.class);     System.out.println(int.class Integer.TYPE);     System.out.println(int[].class.isPrimitive());     System.out.println(int[].class.isArray());     }     }     结果  true     true     false     true     false     true     false     true     2.getConstructor和getConstructors()  java中构造方法没有先后顺序通过类型和参数个数区分。   public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException {     // TODO Auto-generated method stub     String str abc;     System.out.println(String.class.getConstructor(StringBuffer.class));     }     }     3.Filed类代表某一类中的一个成员变量。  import java.lang.reflect.Field;     public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, Exception {     ReflectPointer rp1 new ReflectPointer(3,4);     Field fieldx rp1.getClass().getField(x);//必须是x或者y     System.out.println(fieldx.get(rp1));     /*     * private的成员变量必须使用getDeclaredField并setAccessible(true),否则看得到拿不到     */     Field fieldy rp1.getClass().getDeclaredField(y);     fieldy.setAccessible(true);//暴力反射     System.out.println(fieldy.get(rp1));     }     }     class ReflectPointer {     public int x 0;     private int y 0;     public ReflectPointer(int x,int y) {//alt shift s相当于右键source     super();     // TODO Auto-generated constructor stub     this.x x;     this.y y;     }     }     三.典型例题  1.将所有String类型的成员变量里的b改成a。  import java.lang.reflect.Field;     public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, Exception {     ReflectPointer rp1 new ReflectPointer(3,4);     changeBtoA(rp1);     System.out.println(rp1);     }     private static void changeBtoA(Object obj) throws RuntimeException, Exception {     Field[] fields obj.getClass().getFields();     for(Field field : fields) {     //if(field.getType().equals(String.class))     //由于字节码只有一份,用equals语义不准确     if(field.getType()String.class) {     String oldValue (String)field.get(obj);     String newValue oldValue.replace(b, a);     field.set(obj,newValue);     }     }     }     }     class ReflectPointer {     private int x 0;     public int y 0;     public String str1 ball;     public String str2 basketball;     public String str3 itcat;     public ReflectPointer(int x,int y) {//alt shift s相当于右键source     super();     // TODO Auto-generated constructor stub     this.x x;     this.y y;     }     Override     public String toString() {     return ReflectPointer [str1 str1 , str2 str2 , str3     str3 ];     }     }     2.写一个程序根据用户提供的类名调用该类的里的main方法。  为什么要用反射的方式呢  import java.lang.reflect.Field;     import java.lang.reflect.Method;     public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, Exception {     String str args[0];     /*     * 这样会数组角标越界因为压根没有这个字符数组     * 需要右键在run as-configurations-arguments里输入b.Inter完整类名     *      */     Method m Class.forName(str).getMethod(main,String[].class);     //下面这两种方式都可以,main方法需要一个参数     m.invoke(null, new Object[]{new String[]{111,222,333}});     m.invoke(null, (Object)new String[]{111,222,333});//这个可以说明数组也是Object     /*     * m.invoke(null, new String[]{111,222,333})     * 上面的不可以,因为java会自动拆包     */     }     }     class Inter {     public static void main(String[] args) {     for(Object obj : args) {     System.out.println(obj);     }     }     }     3.模拟 **[instanceof**](http://mp.weixin.qq.com/s?__bizMzI3ODcxMzQzMwmid2247483795idx1sn20613cdddf5446b0cdcc48ef440ad8c7chksmeb5384a5dc240db3a5070cedd0f764ecbe3056b609b6ff11854f2dbd91a017f71c52147c473ascene21#wechat_redirect) 操作符  class S {       }        public class IsInstance {       public static void main(String args[]) {       try {       Class cls Class.forName(S);       boolean b1 cls.isInstance(new Integer(37));       System.out.println(b1);       boolean b2 cls.isInstance(new S());       System.out.println(b2);       }       catch (Throwable e) {       System.err.println(e);       }       }       }      在这个例子中创建了一个S 类的 Class 对象然后检查一些对象是否是S的实例。Integer(37) 不是但 new S()是。  推荐阅读instanceof、isInstance、isAssignableFrom  四.Method类  代表类不是对象中的某一方法。  import java.lang.reflect.Field;     import java.lang.reflect.Method;     /*     * 人在黑板上画圆涉及三个对象,画圆需要圆心和半径但是是私有的画圆的方法     * 分配给人不合适。     *      * 司机踩刹车司机只是给列车发出指令刹车的动作还需要列车去完成。     *      * 面试经常考面向对象的设计比如人关门人只是去推门。     *      * 这就是专家模式谁拥有数据谁就是专家,方法就分配给谁     */     public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, Exception {     String str shfsfs;     //包开头是com表示是sun内部用的java打头的才是用户的     Method mtCharAt String.class.getMethod(charAt, int.class);     Object ch mtCharAt.invoke(str,1);//若第一个参数是null则肯定是静态方法     System.out.println(ch);     System.out.println(mtCharAt.invoke(str, new Object[]{2}));//1.4语法     }     }      五.数组的反射  Array工具类用于完成数组的反射操作。  同类型同纬度有相同的字节码。  int.class和Integer.class不是同一份字节码Integer.TYPETYPE代表包装类对应的基本类的字节码 int.classInteger.TYPE。  import java.util.Arrays;     /*     * 从这个例子看出即便字节码相同但是对象也不一定相同,根本不是一回事     *      */     public class TestReflect {     public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, Exception {     int[] a new int[3];     int[] b new int[]{4,5,5};//直接赋值后不可以指定长度否则     int[][] c new int[3][2];     String[] d new String[]{jjj,kkkk};     System.out.println(ab);//false     System.out.println(a.getClass()b.getClass());//true     //System.out.println(a.getClass()d.getClass());    //比较字节码a和cd也没法比     System.out.println(a.getClass());//输出class [I     System.out.println(a.getClass().getName());//输出[I,中括号表示数组I表示整数     System.out.println(a.getClass().getSuperclass());//输出class java.lang.Object     System.out.println(d.getClass().getSuperclass());//输出class java.lang.Object     //由于父类都是Object,下面都是可以的     Object obj1 a;//不可是Object[]     Object obj2 b;     Object[] obj3 c;//基本类型的一位数组只可以当做Object非得还可以当做Object[]     Object obj4 d;     //注意asList处理int[]和String[]的区别     System.out.println(Arrays.asList(b));//1.4没有可变参数使用的是数组,[[I1bc4459]     System.out.println(Arrays.asList(d));//[jjj, kkkk]     }     }      六.结束语  以上就是反射机制的简单的使用显然学过spring的朋友一定明白了为什么可以通过配置文件就可以让我们获得指定的方法和变量在我们创建对象的时候都是通过传进string实现的就好像你需要什么我们去为你生产还有我们一直在用Object,这就说明java语言的动态特性依赖性大大的降低了。  本文版权归作者火星十一郎所有欢迎转载和商用但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接否则保留追究法律责任的权利.  关注公众号Java技术栈回复面试获取我整理的2020最全面试题及答案。  推荐去我的博客  1.Java JVM、集合、多线程、新特性系列教程  2.Spring MVC、Spring Boot、Spring Cloud 系列教程  3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程  4.Java、后端、架构、阿里巴巴等大厂最新面试题  觉得不错别忘了点赞转发哦  最后关注下面的栈长的微信公众号Java技术栈回复福利可以免费获取一份我整理的 2020 最新 Java 面试题真的非常全含答案无任何套路。
http://wiki.neutronadmin.com/news/238914/

相关文章:

  • 河南做网站联系电话经营性质网站
  • 深圳市龙岗区住房和建设局网站南通做百度网站的公司网站
  • 寻乌建设局网站个人网站开发多少钱
  • 三水容桂网站制作wordpress 伪静态插件
  • 做网站去哪里做wordpress 分类目录图片
  • 建设建材网站费用河北师大科技楼网站建设
  • 一个域名可以建设几个网站网站制作要多长时间
  • 坪山新区网站建设网站排名优化原理
  • 如何做一个网站平台设计上海地址
  • 郑州做网站网站建设费用成都哪家公司做网站最好
  • 浏览器网站大全免费如何做拍卖网站
  • 免费的行情网站app软件深圳品牌策划公司计划书
  • 四川省建设厅资格注册中心网站wordpress增加登录账户
  • 网站源码安装合肥网站建设5k5
  • 编程网站scratch网址友链交易交易平台
  • 网站备案到公司永兴网站开发
  • 网站建设方案书文库wordpress打开后台很卡
  • 那里有个人做网站的常州天宁区做网站公司
  • 建筑工程网站开发wordpress打开页面
  • 微信公众号微网站开发wordpress增强型短代码
  • 湖北网站建设哪家专业wordpress 不同的文章
  • 如何开发自己的网站锦州网站建设多少钱
  • 网站更换服务器 备案php网站的优势
  • 做淘宝网站的主机上海著名网站设计公司
  • 本地wordpress站点上传文件千锋前端培训班
  • 如何做提卡网站wordpress内容查看
  • 亲子网 网站正在建设中商品推销
  • 从事网站开发需要的证书杭州百度快照推广
  • 机构改革 住房与城乡建设厅网站dedecms妇科医院wap网站模板 v1.0
  • 高端网站建站公司html中文网站作业