朋友希望能帮助到你1.反射的主要类2.反射调用优化3.Class类分析4.Class常用方法5.获取Class对象的方式6.那些类型有Class对象7.类加载8.类加载阶段1.反射的主要类Java.lang.Class:代表一个类Class对象表示某个类加载后在堆中的对象Java.lang.reflect.Method:代表类的方法Method对象表示某个类的方法Java.lang.reflect.Field:代表类的成员变量File对象表示某个类的成员变量Java.lang.reflect.Constructor:代表类的构造方法Constructor对象表示构造器packagecom.polar;importjava.io.File;importjava.io.FileInputStream;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.Properties;publicclassApplication{SuppressWarnings({all})publicstaticvoidmain(String[]args)throwsException{StringfilePathsrc\\re.properties;//File file new File(filePath);//file.createNewFile();PropertiespropertiesnewProperties();properties.load(newFileInputStream(filePath));Stringclassfullpathproperties.get(classfullpath).toString();Stringmethodproperties.get(method).toString();/** * Java.lang.Class:代表一个类Class对象表示某个类加载后在堆中的对象 * Java.lang.reflect.Method:代表类的方法Method对象表示某个类的方法 * Java.lang.reflect.Field:代表类的成员变量File对象表示某个类的成员变量 * Java.lang.reflect.Constructor:代表类的构造方法Constructor对象表示构造器 *///ClassClassaClassClass.forName(classfullpath);ObjectoaClass.newInstance();//MethodMethodmethod1aClass.getMethod(method);System.out.print(java.lang.reflect.Method调用方法:);method1.invoke(o);//FieldFieldnameaClass.getField(name);System.out.print(java.lang.reflect.Field获取成员变量:);System.out.println(name.get(o));//ConstructorConstructorconstructoraClass.getConstructor();System.out.print(java.lang.reflect,Constructor获取无参构造器:);System.out.println(constructor);Constructorconstructor1aClass.getConstructor(String.class);System.out.print(java.lang.reflect.Constructor获取含参构造器:);System.out.println(constructor1);}}2.反射调用优化反射的优点可以动态创建和使用对象(也是框架底层核心)使用灵活没有反射机制框架技术就失去可底层支持反射的缺点使用反射基本是解释执行对执行速度有影响代码演示传统方法和反射机制运行速度得差别packagecom.polar;importjava.lang.reflect.Method;publicclassV{publicstaticvoidmain(String[]args)throwsException{V1();V2();}//传统调用publicstaticvoidV1(){//创建对象BearbearnewBear();//使用System计时longstartSystem.currentTimeMillis();for(inti0;i99999;i){bear.Test();}longendSystem.currentTimeMillis();System.out.println(传统方法耗时(end-start));}//反射调用publicstaticvoidV2()throwsException{ClassaClassClass.forName(com.polar.Bear);ObjectoaClass.newInstance();MethodtestaClass.getMethod(Test);longstartSystem.currentTimeMillis();for(inti0;i99999;i){test.invoke(o);}longendSystem.currentTimeMillis();System.out.println(反射方法耗时(end-start));}}运行结果可知反射的确运行速度慢对反射调用进行优化Method、Field、Constructor都可以使用setAccessible进行优化setAccessible作用是启动和禁用访问安全的开关当setAccessible方法参数为true时反射的对象在使用时关闭访问检查提高反射效率当setAccessible方法参数为false时反射的对象在使用时开启访问检查降低反射效率代码演示反射优化packagecom.polar;importjava.lang.reflect.Method;publicclassV{publicstaticvoidmain(String[]args)throwsException{V1();V2();V3();}//传统调用publicstaticvoidV1(){//创建对象BearbearnewBear();//使用System计时longstartSystem.currentTimeMillis();for(inti0;i99999;i){bear.Test();}longendSystem.currentTimeMillis();System.out.println(传统方法耗时(end-start));}//反射调用publicstaticvoidV2()throwsException{ClassaClassClass.forName(com.polar.Bear);ObjectoaClass.newInstance();MethodtestaClass.getMethod(Test);longstartSystem.currentTimeMillis();for(inti0;i99999;i){test.invoke(o);}longendSystem.currentTimeMillis();System.out.println(反射方法耗时(end-start));}//反射调用优化publicstaticvoidV3()throwsException{ClassaClassClass.forName(com.polar.Bear);ObjectoaClass.newInstance();MethodtestaClass.getMethod(Test);test.setAccessible(true);//在调用方法时关闭访问检查longstartSystem.currentTimeMillis();for(inti0;i99999;i){test.invoke(o);}longendSystem.currentTimeMillis();System.out.println(反射优化后耗时(end-start));}}优化后(优化效果。。。。。)但好歹也优化了对优化了。。。。。_3.Class类分析Class也是类因此也继承Object类Class类对象不是new出来的而是系统创建的一个Class对象在内存中只会存在一份因为类只会加载一次可通过比较哈希值每个类的实例都会记得自己由那个Class实例生成通过Class对象可以完整的得到一个类的完整结构通过一系列的API方法Class对象是放在堆的类的字节码二进制数据是放在方法区的有的地方称为类的元数据方法、变量名、方法名、访问权限等等4.Class常用方法代码演示packagecom.polar;importjava.lang.reflect.Field;publicclassmethodTest{publicstaticvoidmain(String[]args)throwsException{//Bear类所在路径StringclassFullPathcom.polar.Bear;//创建对应的Class对象Class?aClassClass.forName(classFullPath);//输出Class类对象的归属System.out.println(aClass);//输出运输类型System.out.println(aClass.getClass());//输出包名System.out.println(aClass.getPackage().getName());//输出全类名System.out.println(aClass.getName());//创建对象实例ObjectoaClass.newInstance();System.out.println(o);//通过反射获取属性FieldnameaClass.getField(name);System.out.println(name.get(o));//通过反射对属性进行复制name.set(o,Polarbear);System.out.println(name.get(o));//通过反射获取所有字段得属性Field[]fieldsaClass.getFields();//字段属性for(Fieldfield:fields){System.out.println(field.getName());}//字段属性的值for(Fieldfield:fields){System.out.println(field.get(o));}}}5.获取Class对象的方式Class.forName(编译阶段):已知类的全类名多用于配置文件、读取类的全路径、加载类类名.class(加载阶段)用于参数传递对象.getClass(运行阶段)有对象实例类的加载器阶获取对象基本数据类型获取对对象基本数据类型的包装类获取对象packagecom.polarBear;publicclassDemo01{publicstaticvoidmain(String[]args)throwsException{//处于编译阶段已知全类名StringclassAllPathcom.polarBear.Bear;Class?aClassClass.forName(classAllPath);System.out.println(aClass);//处于加载阶段多用于参数传递ClassBearbearClassBear.class;System.out.println(bearClass);//处于运行阶段有对象实例BearbearnewBear();Class?extendsBearaClass1bear.getClass();System.out.println(aClass1);//通过加载器获取类的对象/** * 先得到类加载器 * 通过类加载得到Class对象 */ClassLoaderclassLoaderbear.getClass().getClassLoader();Class?aClass2classLoader.loadClass(classAllPath);System.out.println(aClass2);System.out.println(aClass.hashCode());System.out.println(bearClass.hashCode());System.out.println(aClass1.hashCode());System.out.println(aClass2.hashCode());//基本数据类型获得Class类对象ClassIntegerintegerClassint.class;System.out.println(integerClass);//基本数据类型的包装类通过 .TYPR 得到Class对象ClassIntegertypeInteger.TYPE;System.out.println(type);}}通过比较他们的哈希值可知是否为同一个对象6.那些类型有Class对象外部类、内部类interface接口数组enum:枚举annotation:注解基本数据类型Void7.类加载反射机制是Java实现动态语言的关键也就是通过反射实现类动态加载动态加载运行时加载需要类如果运行时不用该类则不报错降低了依赖性静态加载:编译时加载相关的类如果没有则报错依赖性太强8.类加载阶段加载Loading:JVM在该阶段的主要目的是将字节码文件从不同的数据源(class文件、jar包、网络)转化为二进制字节流加载到内存中并生成一个代表该类的java.lang.Class对象连接Linking:1.验证Verifica:相当于连接得子阶段目的是确保class文件字节流中包含得信息符合当前虚拟机的要求使其不会威胁当前虚拟机的安全。验证内容包括文件格式验证、元数据验证、字节码验证、符号引用验证。可以考虑关闭大部分的类验证来缩短虚拟机类加载得时间。2.准备Preparation:JVM会在该阶段对静态变量分配内存并进行默认初始化(0、0L、null、false)。这些变量所使用的内存都将在方法区中进行分配3.解析Resolution:虚拟机将常量池内的符号引用替换为直接引用的过程初始化Initialization到了初始化阶段才真正开始执行类中定义的java程序,依次自动收集类中所有静态变量的赋值动作和静态代码块的语句并进行合并