反射

 反射:将类的各个组成部分封装为其他对象,这就是反射机制
        * 好处:
            1. 可以在程序运行过程中,操作这些对象。
            2. 可以解耦,提高程序的可扩展性。

获取Class对象的方式:
        1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
            * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
        2. 类名.class:通过类名的属性class获取
            * 多用于参数的传递
        3. 对象.getClass():getClass()方法在Object类中定义着。
            * 多用于对象的获取字节码的方式

        * 结论:
            同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

 1 public class Reflecttest {
 2 public static void main(String[] args) throws ClassNotFoundException{
 3     //方式1Class.forName("全类名")
 4     Class c = Class.forName("reflect2.Person");
 5     System.out.println(c);
 6     //方式2 类名.class:通过类名的属性class获取
 7     Class c1 = Person.class;
 8     System.out.println(c1);
 9     //方式3对象.getClass():getClass()方法在Object类中定义着。
10     Person p = new Person();
11     Class c2 =  p.getClass();
12     System.out.println(c2);
13     //结论同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
14 }
15 }

获取功能:

                            1. 获取成员变量们

                                     * Field[] getFields() :获取所有public修饰的成员变量

                                     * Field getField(String name)   获取指定名称的 public修饰的成员变量

 

                                     * Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符

                                     * Field getDeclaredField(String name) 

                            2. 获取构造方法们

                                     * Constructor<?>[] getConstructors() 

                                     * Constructor<T> getConstructor(类<?>... parameterTypes) 

 

                                     * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 

                                     * Constructor<?>[] getDeclaredConstructors() 

                            3. 获取成员方法们:

                                     * Method[] getMethods() 

                                     * Method getMethod(String name, 类<?>... parameterTypes) 

 

                                     * Method[] getDeclaredMethods() 

                                     * Method getDeclaredMethod(String name, 类<?>... parameterTypes) 

 

                            4. 获取全类名       

                                     * String getName() 

Class personClass=Person.class;
        Field[]  fields=personClass.getFields();
        for (Field field : fields) {//iter
            System.out.println("getFileds(): "+field);
        }

        Field field=personClass.getField("a");
        System.out.println("getField(): "+field);
        System.out.println("=====================================================");


        Field a=personClass.getField("a");
        Person p=new Person();
        Object value=a.get(p);
        System.out.println(p);
        a.set(p,1);
        System.out.println(p);


        System.out.println("=====================================================");

        Field[] fiels2=personClass.getDeclaredFields();
        for (Field field2 : fiels2) {
            System.out.println("getDeclaredFields(): "+field2);
        }

        Field field3=personClass.getDeclaredField("name");
        System.out.println("getDeclaredField(): "+field3);
  •    练习Class对象功能_获取Constructor
Class personClass=Person.class;
        Constructor constructor=personClass.getConstructor();
        Object p1=constructor.newInstance();
        System.out.println(p1);
        System.out.println("=========================================");


        Constructor constructor1=personClass.getConstructor(String.class,String.class);
        Object person1=constructor1.newInstance("aaa","bbb");
        System.out.println(person1);
        System.out.println("=========================================");

        Object person=personClass.newInstance();
        System.out.println(person);
  • 练习class对象获取Method
    Class personClass=Person.class;
            Method[] methods=personClass.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
            System.out.println("=============================");
    
            Method method01=personClass.getMethod("eat");
            Person person=new Person();
            method01.invoke(person);
            System.out.println("==============================");
            Method method02=personClass.getMethod("eat",String.class);
            method02.invoke(person,"zhangsan")

     

 

posted @ 2019-07-28 15:50  路还很长  阅读(163)  评论(0编辑  收藏  举报