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

seo网站建设培训企业网站建设常见问题

seo网站建设培训,企业网站建设常见问题,wordpress主题更换logo,logo设计公司企业目录 ⛳ Java 反射#x1f3a8; 一、反射概述**#x1f383; 使用反射的前提条件: **#x1f3b2; 类正常加载过程如下图#xff1a;反射优缺点#xff1a;#x1f9f8; Java反射机制提供的功能: **#x1f945; 反射主要API** #x1f3ed; 二、反射的使用#x1f3a… 目录 ⛳ Java 反射 一、反射概述** 使用反射的前提条件: ** 类正常加载过程如下图反射优缺点 Java反射机制提供的功能: ** 反射主要API** 二、反射的使用 2.1、class类概述 2.2、得到Class的实例 2.3、Java内置 9 大 Class实例 2.4、获取类中的构造器✨ 2.5、调用构造器创建对象 2.6、获取类中的成员变量并调用(setAccessible)批量获取的方法获取单个的方法设置字段的值 2.7、获取类中的成员方法并调用获取单个的方法调用方法 2.8、反射方法的其他使用之通过反射运行配置文件内容 2.9、反射方法的其它使用之越过泛型检查 三、反射面试题 ⛳ Java 反射 一、反射概述 Reflection反射是Java被视为动态语言的关键反射机制允许程序在执行期借助Reflection API获取任何类的内部信息并直接操作任意对象的内部属性及方法。 JAVA反射机制是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法和属性这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 ** 使用反射的前提条件: ** ​ 必须先得到代表的字节码的ClassClass类用于表示.class文件字节码原因是要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。 类正常加载过程如下图 加载完类之后 在堆内存的方法区中就产生了一个Class类型的对象 一个类只有一个Class对象 这个对象就包含了完整的类的结构信息。 我们可以通过这个对象看到类的结构。 这个对象就像一面镜子 透过这个镜子看到类的结构 所以 我们形象的称之为 反射。 反射优缺点 优点 可以在运行程序的过程中操作这些对象。可以降低耦合度提高程序的可扩展性。 缺点 反射很强大但是消耗性能。主要是为了做工具和框架使用的。 Java反射机制提供的功能: 在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时获取泛型信息在运行时调用任意一个对象的成员变量和方法在运行时处理注解生成动态代理 反射主要API java.lang.Class:代表一个类java.lang.reflect.Method:代表类的方法java.lang.reflect.Field:代表类的成员变量java.lang.reflect.Constructor:代表类的构造器 二、反射的使用 2.1、class类概述 在Object类中定义了以下的方法此方法将被所有子类继承public final Class getClass()以上的方法返回值的类型是一个Class类此类是Java反射的源头实际上所谓反射从程序的运行结果来看也很好理解即可以通过对象反射求出类的名称。 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象包括基本数据类型。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建JVM已经帮我们创建好了。 2.2、得到Class的实例 Student stu new User();Class clz stu.getClass()对象.getClass();得到对象的真实类型因为在Object里所以每个类都有该方法。ClassStudent clz Student.class; 数据类型.class(就是一份字节码)。Class.forName(String className); 根据一个类的全限定名来构建Class对象Class? clz Class.forName(com.gbx.Student);,这里泛型写?原因是此时class不知道类因为传的是字符串。 代码示例 package com.gbx;public class Demo {public static void main(String[] args) {//obj.getClass()方式获取Class对象 Student stu1 new Student();//new 产生一个Student对象一个Class对象。Class stuClass stu1.getClass();//获取Class对象//类名.class方式获取Class对象Class stuClass2 Student.class;//Class.forName(String className)方式获取Class对象try {Class stuClass3 Class.forName(com.gbx.Student);//注意此字符串必须是真实路径就是带包名的类路径包名.类名} catch (ClassNotFoundException e) {e.printStackTrace();}}}注这三种方法获取的都是同一个class对象因为表示都是JVM中共同的一份字节码。 2.3、Java内置 9 大 Class实例 ​ 对于对象来说,可以直接使用obj.getClass()获取Class实例但是基本数据类型,就没有类的权限定名,也没有getClass方法那么如何使用Class类来表示基本数据类型的Class实例 byte,short,int,long,char,float,double,boolean ,void关键字上述8种类型和void关键字,都有class属性。例子如下 表示int的Class对象: Class clz int.class;表示boolean的Class对象: boolean.class;void: Class clz void.class;表示数组的Class实例String[] sArr1 {“A”,“C”}Class clz String[].class;//所有具有相同元素类型和维数的数组才共享同一份字节码(Class对象); 所有的数据类型都有class属性,表示都是Class对象。 注意 int的包装类是Integer那么 Integer.class int.class 结果是false,说明是两份字节码. Integer 和 int 不是同一种数据类型在八大基本数据类型的包装类中都有一个常量:TYPETYPE表示的是该包装类对应的基本数据类型的Class实例。例子如下 Integer.TYPE—int.classInteger.TYPE int.class;//YESInteger.TYPE Integer.class;//ERROR 2.4、获取类中的构造器 Class类获取构造器方法Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器。 批量获取的方法 public Constructor?[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造器。 public Constructor?[] getDeclaredConstructors():获取当前Class所表示类的所有的构造器,和访问权限无关。 获取单个的方法 public ConstructorT getConstructor(Class?... parameterTypes) :获取当前Class所表示类中指定的一个public的构造器。public Constructor getDeclaredConstructor(Class?... parameterTypes):获取当前Class所表示类的所有构造器中指定的一个构造器可以是私有、受保护、默认、公有等。 参数parameterTypes表示:构造器参数的Class类型。如:public Student(String name)Constructor c clz.getConstructor(String.class) 代码示例 package com.gbx;public class Student {public Student() {System.out.println(---);}public Student(String name) {System.out.println(name);}public Student(String name, String school) {System.out.println(name school);}}package com.gbx;public class Constructors {public static void main(String[] args) throws Exception {//1.加载Class对象Class clazz Class.forName(com.gbx.Student);//2.获取所有公有构造器System.out.println(****所有公有构造器****);Constructor[] conArray clazz.getConstructors();for(Constructor c : conArray){System.out.println(c);}//3.获取所有构造器System.out.println(****所有的构造器****);conArray clazz.getDeclaredConstructors();for(Constructor c : conArray){System.out.println(c);}//3.获取单个公有无参构造器System.out.println(****获取单个公有、无参的构造器****);Constructor con clazz.getConstructor(null);System.out.println(con);//4.获取单个指定公有构造器System.out.println(****获取单个指定的公有构造器****);con clazz.getConstructor(String.class);System.out.println(con);//5.获取单个指定构造器System.out.println(****获取单个指定的构造器****);con clz.getDeclaredConstructor(String.class);System.out.println(con);}}✨ 2.5、调用构造器创建对象 常用方法 public T newInstance(Object... initargs)使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例并用指定的初始化参数初始化该实例参数initargs表示调用构造器的实际参数返回返回创建的实例T表示Class所表示类的类型。 提示如果一个类中的构造器可以直接访问同时没有参数那么可以直接使用Class类中的newInstance方法创建对象public Object newInstance()相当于 new 类名() 代码示例 public class newInstances {public static void main(String[] args) throws Exception {//1.加载Class对象ClassStudent clz Student.class;//2.获取构造器ConstructorStudent c clz.getConstructor(String.class);//3.调用构造器创建对象Student stu1 c.newInstance(gbx);//直接访问不带参数的构造器可以直接使用Class的newInstance()方法Student stu2 clz.newInstance();}}2.6、获取类中的成员变量并调用(setAccessible) 批量获取的方法 Field[] getFields()获取当前Class所表示类的所有公有字段。Field[] getDeclaredFields()获取当前Class所表示类的所有字段包括私有、受保护、默认、公有。 获取单个的方法 public Field getField(String fieldName)获取当前Class所表示类的某个公有的字段。public Field getDeclaredField(String fieldName):获取当前Class所表示类的某个字段(可以是私有的)。 设置字段的值 public void set(Object obj,Object value) 参数 obj要设置的字段所在的对象value要为字段设置的值 代码示例 package com.gbx.field;public class Student {public Student(){}//**字段**//public String name;protected int age;char sex;private String phoneNum; }package com.gbx.field; import java.lang.reflect.Field; public class Fields {public static void main(String[] args) throws Exception {//1.获取Class对象Class stuClass Class.forName(com.gbx.field.Student);//2.获取字段System.out.println(***获取所有公有的字段***);Field[] fieldArray stuClass.getFields();for(Field f : fieldArray){System.out.println(f);}System.out.println(***获取所有的字段(包括私有、受保护、默认)***);fieldArray stuClass.getDeclaredFields();for(Field f : fieldArray){System.out.println(f);}System.out.println(***获取某个公有的字段并设置字段值***);Field f stuClass.getField(name);System.out.println(f);System.out.println(***获取私有字段并设置字段值***);f stuClass.getDeclaredField(phoneNum);System.out.println(f);//获取构造器调用构造器获取一个对象Object obj stuClass.getConstructor().newInstance();//产生Student对象相当于Student stu new Student();//为字段设置值f.set(obj, 张三);//为Student对象中的name属性赋值相当于stu.name 张三//检验Student stu (Student)obj;System.out.println(姓名 stu.name); f.setAccessible(true);//Student类中的成员变量phoneNum为private故必须解除“phoneNum”私有限定f.set(obj, 12345678900);System.out.println(电话 stu.phoneNum); } }输出 ***获取所有公有的字段*** public java.lang.String com.gbx.field.Student.name ***获取所有的字段(包括私有、受保护、默认的)*** public java.lang.String com.gbx.field.Student.name protected int com.gbx.field.Student.age char fanshe.com.gbx.Student.sex private java.lang.String com.gbx.field.Student.phoneNum ***获取某个“公有的”字段并设置字段值*** public java.lang.String com.gbx.field.Student.name 姓名张三 ***获取私有字段并设置字段值*** private java.lang.String com.gbx.field.Student.phoneNum 电话12345678900注Java反射机制提供的setAccessible()方法传入true可以取消,Java的安全检查。 2.7、获取类中的成员方法并调用 **批量获取的方法: ** public Method[] getMethods()获取当前Class所表示类和继承过来的所有公有方法包含了父类的方法也包含Object类。public Method[] getDeclaredMethods()获取当前Class所表示类的所有成员方法包括私有的(不包括继承的和访问权限无关)。 获取单个的方法 public Method getMethod(String name,Class?... parameterTypes)获取当前Class所表示类的某个公有方法包括继承的。 public Method getDeclaredMethod(String methodName,Class?... parameterTypes)获取当前Class所表示类的某个成员方法不包括继承的。 参数 methodName方法名Class ... parameterTypes形参的Class类型对象 调用方法 public Object invoke(Object obj,Object ... args) 参数 obj要调用方法的对象args调用方法时所传递的实参 代码演示 package com.gbx.method;public class Student {//****成员方法****//public void show1(String s){System.out.println(调用公有的String参数的show1(): s s);}protected void show2(){System.out.println(调用受保护的无参的show2());}void show3(){System.out.println(调用默认的无参的show3());}private String show4(int age){System.out.println(调用私有的且有返回值的int参数的show4(): age age);return age;} }package com.gbx.method;import java.lang.reflect.Method;public class MethodClass {public static void main(String[] args) throws Exception {//1.获取Class对象Class stuClass Class.forName(com.gbx.method.Student);//2.获取所有公有方法System.out.println(****获取所有”公有“方法****);Method[] methodArray stuClass.getMethods();for(Method m : methodArray){System.out.println(m);}System.out.println(****获取所有本类方法包括私有****);methodArray stuClass.getDeclaredMethods();for(Method m : methodArray){System.out.println(m);}System.out.println(****获取公有的show1()方法****);Method m stuClass.getMethod(show1, String.class);System.out.println(m);//实例化一个Student对象Object obj stuClass.getConstructor().newInstance();//调用方法相当于stu.show1(张三)m.invoke(obj, 张三);System.out.println(****获取私有的show4()方法****);m stuClass.getDeclaredMethod(show4, int.class);System.out.println(m);m.setAccessible(true);//解除私有限定Object result m.invoke(obj, 20);System.out.println(返回值 result);} }输入 ****获取所有”公有“方法**** public void com.gbx.method.Student.show1(java.lang.String) public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public final void java.lang.Object.wait() throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() ****获取所有本类方法包括私有**** public void com.gbx.method.Student.show1(java.lang.String) private java.lang.String com.gbx.method.Student.show4(int) protected void com.gbx.method.Student.show2() void com.gbx.method.Student.show3() ****获取公有的show1()方法**** public void com.gbx.method.Student.show1(java.lang.String) 调用公有的String参数的show1(): s 张三 ****获取私有的show4()方法**** private java.lang.String com.gbx.method.Student.show4(int) 调用私有的且有返回值的int参数的show4(): age 20 返回值202.8、反射方法的其他使用之通过反射运行配置文件内容 Student类 public class Student {public void show(){System.out.println(It is show());} }配置文件以txt文件为例子p.txt: className com.gbx.Student methodName show代码示例 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Method; import java.util.Properties;public class Demo {public static void main(String[] args) throws Exception {//通过反射获取Class对象Class stuClass Class.forName(getValue(className));//com.gbx.Student//2获取show()方法Method m stuClass.getMethod(getValue(methodName));//show//3.调用show()方法m.invoke(stuClass.getConstructor().newInstance()); }//此方法接收一个key在配置文件中获取相应的valuepublic static String getValue(String key) throws IOException{Properties p new Properties();//获取配置文件的对象FileReader fr new FileReader(p.txt);//获取字符输入流p.load(fr);//将流加载到配置文件对象中in.close();return p.getProperty(key);//返回根据key获取的value值} }优点当我们升级这个系统时不要Student类而需要新写其他类时这时只需要更改p.txt里的文件内容就可以了代码不用改动。 2.9、反射方法的其它使用之越过泛型检查 泛型用在编译期编译过后泛型擦除消失所以是可以通过反射越过泛型检查的。 例如有一个String泛型的集合怎样能向这个集合中添加一个Integer类型的值 代码示例 import java.lang.reflect.Method; import java.util.ArrayList;public class Demo {public static void main(String[] args) throws Exception{ArrayListString list new ArrayList();list.add(aaa);list.add(bbb);//list.add(100);//获取ArrayList的Class对象反向的调用add()方法添加数据Class listClass list.getClass(); //得到 list对象的字节码对象//获取add()方法Method m listClass.getMethod(add, Object.class);//调用add()方法m.invoke(list, 100);//遍历集合for(Object obj : list){System.out.println(obj);}} }输出 aaa bbb 100这样说明可以通过反射越过泛型检查向String泛型的集合中添加一个Integer类型的值。 三、反射面试题 题目如何在不改变String内存地址的情况下改变String的内容 正常创建 Test public void test3() {String s new String(abc); //堆里面产生sString s1 s; //s1s 123;String s2 s;System.out.println(s1.hashCode() s2.hashCode() );System.out.println(s1 s2); } /** * 结果 * 96354 48690 * false */图示 通过反射操作String中的value属性 Test public void test4() throws Exception {String s new String(123); //堆里面产生sString s1 s; //s1Field vf String.class.getDeclaredField(value);vf.setAccessible(true);char[] chars {97, 98, 99};vf.set(s, chars);String s2 s;System.out.println(s1.hashCode() s2.hashCode() );System.out.println(s1 s2);/*** 结果* 96354 96354* true**/ }图示
http://www.hkea.cn/news/14559064/

相关文章:

  • 电商网站现状分析还有网站吗
  • 来宾市住房和城乡建设局网站卓越网站建设的优点
  • 网站做支付宝支付需要哪些资料章丘市网站建设seo
  • 高端人才招聘网站wordpress主题 使用教程
  • 十三师建设局网站制作论文招聘网站的
  • 自己做网站服务器的备案方法网络营销是什么样的营销模式
  • 网站备案是每年一次吗为wordpress开发app
  • 商城网站方案模板做网站为什么要做备案接入
  • 四川建设人才官方网站兰州事件最新进展
  • 多语种网站营销找代码的网站
  • 网站 模板 htmlwordpress 自定义后台登录页面
  • 打码网站建设南京和筑建设有限公司网站
  • 个人网站设计论文道客巴巴wordpress使用腾讯cos
  • wordpress制作小说站教程企业设计公司
  • 建设网站怎么入账网站建设空间选择的重要性
  • 昆山住房与城乡建设局网站国家市场监督局官网入口
  • 搬瓦工如何搭建做网站高大上的企业网站
  • dw做网站表格插不到右边重庆公共资源交易中心网
  • 学网站建设前途wordpress 所有标签页
  • 写男主重生做网站的小说国内优秀公司网站
  • 翻译做网站好的设计网站
  • 银川怎么做网站导航类的wordpress
  • 株洲网站建设的公司怎么找成品ppt网站
  • 温州高端网站建设公司哪家好建设网站招标
  • 装饰网站模版wordpress获取文章内容
  • 沈阳建设工程质量检测中心网站苏州关键词优化seo
  • 网站降权投诉wordpress制作电商网站
  • 网站建设软硬件平台有哪些WordPress中文旅游模板
  • 1999年怎样建立企业网站网站建设下载
  • 违规网站开发 开发者如何规避风险南阳手机网站建设