java反射机制浅析

来源:互联网 发布:暗影格斗2mac 编辑:程序博客网 时间:2024/06/15 22:02

本文主要是概念梳理,深入研究待续
程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,如需要调用该对象运行类型的方法,若编译和运行都知道,使用instantof判断后强转即可,若编译时无法预知该对象属于什么类,程序只能靠运行时发现对象的真实信息,这就必须使用反射了

java程序中各个java类属于同一类事物,描述这类事物的类名就是Class,即字节码。
获取各个类的Class(字节码)有三种方式
1.类名.class
2.对象.getClass()
3.Class.forName(String className)静态方法,className表示全限定名;如String的全限定名:java.lang.String;

反射就是把java类中的各种成分映射成相应的java类,一个类中的组成部分,成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示。Java的Class类显然要提供一系列的方法,来获得其中的变量、方法、构造方法,修饰符、包等信息,这些信息就是用相应的类的实例对象来表示,他们分别是 Filed Method Construct Package

构造方法的反射应用
Constructor类,

//得到全部构造器Constructor<?>[] constructors = Person.class.getConstructors();//得到指定构造器,必须将构造器参数传入 try {            Constructor constructor =Person.class.getConstructor(String.class, int.class);        } catch (NoSuchMethodException e) {            e.printStackTrace();        }

成员变量的反射

Person person = new Person();        Field[] fields = person.getClass().getFields();        try {            Field nameField = person.getClass().getField("name");            String  name = (String) nameField.get(person);        } catch (Exception e) {            e.printStackTrace();        }
  /**     * 所有的String 成员变量都只截取前六位     * @param obj     */    public void changeFild(Object obj) {        Field[] declaredFields = obj.getClass().getDeclaredFields();        for (Field field:declaredFields){            field.setAccessible(true);//设置成员变量可访问(暴力反射)            if (field.getType()==String.class){                try {                    String str= (String) field.get(obj);//读取成员变量的值                    String substring = str.substring(0, 6);                    field.set(obj,substring);//重新设置成员变量的值                } catch (IllegalAccessException e) {                    e.printStackTrace();                }            }        }    }
 try {            Constructor<Person> constructor = Person.class.getConstructor(String.class, int.class);            Person peron = constructor.newInstance("zhangsan", 16);            Method method = person.getClass().getMethod("setName",String.class);            method.invoke(person,"zhangsna");        } catch (Exception e) {            e.printStackTrace();        }
0 0
原创粉丝点击