网站开发 跨平台开发技术,爆款采集推广引流软件,昌吉做网站,专业手机网站设计一#xff0c;反射的概念对于一个人来说#xff0c;了解自己的能力、本事、特点#xff0c;对于他去干事创业来说#xff0c;是很重要的。同样的#xff0c;对于一门面向对象的语言来说#xff0c;了解类(对象其实就是类的实现)本身也是重要的#xff0c;可以在很多地方…一反射的概念对于一个人来说了解自己的能力、本事、特点对于他去干事创业来说是很重要的。同样的对于一门面向对象的语言来说了解类(对象其实就是类的实现)本身也是重要的可以在很多地方帮助程序更好的进行。那么类/对象本身包含那些内容呢无非就是类名称父类继承的接口类的属性类的方法这些都属于是类的信息。好的那么这些信息程序员都知道啊类的信息在定义类的时候不是都写的明明白白的吗。但是反射的意义却是在程序跑起来之后可以使用代码去获取类的信息。这个没有反射可办不到。Java是面向对象的所有的东西都是有类别的。所以哦类的信息也是一种类型(就像用户信息可以用UserInfo类描述)类的信息对应的Java类为Class类注意不是关键字class哈。举个最常见的栗子public class ClassDemo {public static void main(String[] args) {try {Class mysqlDriverClass.forName(com.mysql.jdbc.Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}}这里Class.forName很明显是Class类的一个static方法这个方法的意思就是按类名(完整的带包路径的类名)返回类对应的Class对象。因为forName的参数是可以随便写的嘛所以会抛出一个ClassNotFoundException。Class.forName方法是在程序运行时按类名称获取类的信息的方法这就是反射机制。二如何获取类的Class对象我们定义一个普通类Student可以有三种方式获取到Student的类型信息package temp;public class Student {String studentName;public String getStudentName(){return studentName;}public static void main(String[] args) throws ClassNotFoundException {//方式1 利用类名称Class class1 Class.forName(temp.Student);//方式2 利用类Class class2Student.class;//方式3 利用对象Student studentnew Student();Class class3student.getClass();}}三通过类的Class对象获取类的属性和方法获取到Class(类的类型)之后再获取属性和方法就简单了直接使用Class类封装的方法即可。getDeclaredFields:获取类属性getDeclaredMethods():获取类方法使用一个完整的程序演示如下package temp;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Student {String studentName;public String getStudentName(){return studentName;}public static void main(String[] args) throws ClassNotFoundException {Class classStuStudent.class;Field[] fields classStu.getDeclaredFields();for(Field field:fields){System.out.println(属性类型field.getType().getSimpleName(),属性名称:field.getName());}Method[] methodsclassStu.getDeclaredMethods();for(Method method:methods){System.out.println(方法名称method.getName(),返回类型method.getReturnType());}}}执行结果如下属性类型String,属性名称:studentName方法名称main,返回类型void方法名称getStudentName,返回类型class java.lang.String可见通过Class类封装的方法可以在程序运行时候直接获取类的信息。四反射的意义凡是都有正反两个方面先说不好的消息吧用了反射性能肯定是会降低的。注意此处的性能低并不是说通过反射获取类的信息性能低因为除了反射也没有啥可以获取类的信息的机制了。性能低是指通过反射调用方法性能低看下面的例子通过反射获取到方法之后可以将该方法应用到一个对象上实现该对象的方法调用。本来可以直接调用反射之后再调用肯定效率要低的。Class classStuStudent.class;Student studentnew Student();Method methodGetclassStu.getDeclaredMethod(getStudentName);//可以通过Method类的invoke方法调用类方法当然必须得提供对象String name(String)methodGet.invoke(student);System.out.println(name);但是反射的正面意义还是光辉的首先提供了一种了解类的信息的手段使程序运行编写、运行更加自由灵活充满了更多可能性。简单的想在将对象转换为json时键值对的键不就是对象的属性名称么用反射获取对象的属性名称是多么爽快的事情啊。