java反射的概念:java的反射机制是指在运行状态下,对于一个类来讲,能够获得这个类的全部方法和属性。对于一个对象来讲,能够调用这个对象的人和方法和属性。 反射机制首先会拿到该类的字节码文件(Class文件),而后反向获取这个类的全部信息。(注意:一个类型的类在运行中,只产生一个class文件)java
既然反射的前置条件是获取class类,因此不得不提出获取class的方法。ide
获取class的几种方式:代理
(1)Persion p=new Persion();code
Class c=p.getClass(); 该方法不推荐使用,由于已经有了persion对象,反射画蛇添足。
(2)Class c=Persion.class;对象
任意的类都是继承object类,任何类也都有.class属性,说明object里面有一个class用来获取类的信息,可是该方法须要倒入包,依赖强。
(3)Class c =Class.forName("com.xxxx.xxxx")继承
推荐第三种,无序导包,效率较高。
以上三种方法得到的c对象都是同一个对象,由于类在运行的过程当中,只产生一个class文件。接口
反射重要的类和方法get
(1)Class类it
getName():得到类的完整名字。
getFields():得到类的public类型的属性。
getDeclaredFields():得到类的全部属性。包括private 声明的和继承类
getMethods():得到类的public类型的方法。
getDeclaredMethods():得到类的全部方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):得到类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():得到类的public类型的构造方法。
getConstructor(Class[] parameterTypes):得到类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():经过类的不带参数的构造方法建立这个类的一个对象。io
boolean isPrimitive = class1.isPrimitive();//判断是不是基础类型
boolean isArray = class1.isArray();//判断是不是集合类
boolean isAnnotation = class1.isAnnotation();//判断是不是注解类
boolean isInterface = class1.isInterface();//判断是不是接口类
boolean isEnum = class1.isEnum();//判断是不是枚举类
boolean isAnonymousClass = class1.isAnonymousClass();//判断是不是匿名内部类
boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰
String className = class1.getName();//获取class名字 包含包名路径
Package aPackage = class1.getPackage();//获取class的包信息
String simpleName = class1.getSimpleName();//获取class类名
int modifiers = class1.getModifiers();//获取class访问权限
Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类
Class<?> declaringClass = class1.getDeclaringClass();//外部类
(2)Field类(通常于Class类连用)
Class c =Class.forName("XXXX"); Field fields=c.getDeclaredFields("fieldName"); fields.setAccessible(true);//设置私有变量可访问 Object obj=c.newInstance(); fields.set(obj,"xxx")//设置变量的值
(3)Method
Class.forName("com.XXX.XXX." + className).newInstance().getMethod("methodName").invoke("methodName",String ...)//调用反射对象的方法
(4)Constructor类
Constructor<?> cons=Class.forName("com.XXX.XXX." + className).getConstructor(Param.class)//Param可谓int,String,Object等,对应着对象的param类型的构造方法。
cons.newInstance(Param.class.newInstance());//param的具体值(对象)
反射的应用场景:
(1)简单工厂
(2)代理模式
(3)通常还和配置文件共同使用
Class clazz = Class.forName("com.XXX.XXX." + className);//className为配置文件className的值Object obj = clazz.newInstance();Method method = clazz.getMethod(methodName);//methodName为配置文件methodName的值method.invoke(obj);