JAVA反射详解

star2017 1年前 ⋅ 1641 阅读

定义:

    指在JAVA程序运行状态中:

        ①给定的一个类(Class)对象,通过反射获取这个类(Class)对象的所有成员结构;

        ②给定的一个具体对象,能够动态地调用它的方法及对任意属性值进行获取和复制

    这种动态获取类的内容,创建对象,以及动态调用对象的方法及操作属性的机制


反射的特点——优劣势:

    优势

        增加程序的灵活性,避免将固有的逻辑程序写死到代码里

        代码简洁,可读性强,科提高代码的复用率

    缺点

        相对直接调用,在量大的情境下反射性能下降

        存在一些内部暴露和安全隐患


获取java.lang.Class字节码对象的四种方法:

        //通过类获取
Class clazz1 = GPDispatcherServlet.class;
//通过对象获取
Class clazz2 = new GPDispatcherServlet().getClass();
//通过Class.forName()方法获取
Class clazz3 = Class.forName("mvcframework.servlet.GPDispatcherServlet");
//通过类加载器获取
Class clazz4 = GPDispatcherServlet.class.getClassLoader().loadClass("mvcframework.servlet.GPDispatcherServlet");


反射-基本信息操作:

        //获取类的修饰符
int modifiers = clazz.getModifiers();
//获取类的包名
Package clazzPackage = clazz.getPackage();
//获取类的全路径名称
String name = clazz.getName();
//获取类的简单名称
String simpleName = clazz.getSimpleName();
//获取类的类加载器
ClassLoader classLoader = clazz.getClassLoader();
//获取类实现的接口列表
Class[] interfaces = clazz.getInterfaces();
//获取类的父类
Class superclass = clazz.getSuperclass();
//获取类的注解列表
Annotation[] annotations = clazz.getAnnotations();

反射-字段操作:

        //获取类中所有的公有字段,包含继承的直接父类及所有的间接父类
Field[] fields = clazz.getFields();
//获取类中定义的字段(本类的内部的字段,包含私有的字段)
Field[] declaredFields = clazz.getDeclaredFields();
//获取指定名称的公有字段
Field field = clazz.getField("test");
//获取指定名称的本类中定义的字段
Field declaredField = clazz.getDeclaredField("test");
//获取字段的修饰符
int fieldModifiers = field.getModifiers();
//获取字段强制访问权限(当字段的访问权限为private时需要)
field.setAccessible(true);
//成员字段赋值(需要指定对象)
declaredField.set(testObject,"testString");
//静态字段赋值(无需指定对象)
staticField.set(null,"testString");

反射-方法操作:

        //获取类中所有的公有方法(包含继承的方法)
Method[] methods = clazz.getMethods();
//获取类中定义的方法(仅限于本类,包含private方法)
Method[] declaredMethods = clazz.getDeclaredMethods();
//获取类中指定名称和参数的公有方法(包含继承的方法)
Method method = clazz.getMethod("toString",String.class);
//获取类中定义指定名称和参数的方法(包含本类的私有方法)
Method declaredMethod = clazz.getDeclaredMethod("main", String[].class);
//获取方法的修饰符
int methodModifiers = method.getModifiers();
//指定对象进行成员方法的调用
method.invoke(testObject,"arg1","arg2");
//指定方法的强制访问
method.setAccessible(true);
//静态方法调用
declaredMethod.invoke(null);

反射-构造器操作:

        //获取类中所有的公有构造器
Constructor[] constructors = clazz.getConstructors();
//获取类中所有的构造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
//获取类中无参的构造器
Constructor declaredConstructor = clazz.getDeclaredConstructor();
//获取类中有惨构造
Constructor clazzDeclaredConstructor = clazz.getDeclaredConstructor(String.class);
//获取构造器的修饰符
int constructorModifiers = declaredConstructor.getModifiers();
//构造器实例对象
Object o = declaredConstructor.newInstance();
//指定构造器的强制访问
declaredConstructor.setAccessible(true);
//有参构造调用
Object o1 = clazzDeclaredConstructor.newInstance("test");
//class直接调用默认无参构造
Object o2 = clazz.newInstance();



更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: