反射Class

一.创建此 Class

1. 通过类的名字来得到

Class<?> c1 = Class.forName("_1Class.Person");

System.out.println(c1);

2. 根据对象来得到类对象
 Person p1 = new Person("张三",18);
 Class<?> c2 = p1.getClass();
 System.out.println(c2);

 3. 根据类来得到
 Class<?> c3 = Person.class;
 System.out.println(c3);

二.使用类对象来创建对象

Person p2 = null;
        try {
            p2 = (Person)c1.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

三.得到构造方法

    1. 得到类对象的公开的构造方法
        Constructor[] cons1 = c1.getConstructors();

     for(int i=0;i<cons1.length;i++)
        {
            System.out.println(cons1[i].toGenericString());
        }

    2.得到类对象的所有的构造方法

    Constructor[] cons2 = c1.getDeclaredConstructors();
        System.out.println("所有方法:");
        for(int i=0;i<cons2.length;i++)
        {
            System.out.println(cons2[i].toGenericString());
        }

  3. 得到指定的构造方法
        Constructor con1 = c1.getConstructor(new Class[]{});
        System.out.println("无参数的构造方法:"+con1);
        Constructor con2 = c1.getConstructor(new Class[]{String.class,int.class});
        System.out.println("有参数的构造方法:"+con2);
        Constructor con3 = c1.getDeclaredConstructor(new Class[]{String.class});
        System.out.println("有参数的构造方法:"+con3);

扫描二维码关注公众号,回复: 2889972 查看本文章

 4. 没有权限的方法,要访问,得设置accessible为true
        con3.setAccessible(true);

 5. 使用的到的构造方法来创建对象
        Person p1 = (Person)con1.newInstance();
        Person p2 = (Person)con2.newInstance("小明",18);
        Person p3 = (Person)con3.newInstance("大明");

四.获得Methd方法

      1. 得到该类对象上的所有方法信息(还含有父类继承来的方法)
        Method[] methods1 = c1.getMethods();
        System.out.println("所有公开的方法:");
        for (int i = 0; i < methods1.length; i++) {
            System.out.println(methods1[i].toGenericString());
        }

       2. 得到该类对象上的自身所有方法信息(含私有方法)
        Method[] methods2 = c1.getDeclaredMethods();
        System.out.println("自身所有方法:");
        for (int i = 0; i < methods2.length; i++) 
        {
            System.out.println(methods2[i].toGenericString());
        }
        
        3. 得到具体某个方法
        3.1 得到无参数方法
        Method m1 = c1.getMethod("work", new Class[]{});
        System.out.println("无参public work方法:"+m1);
        3.2 得到有参数方法        
        Method m2 = c1.getMethod("work", new Class[]{String.class});
        System.out.println("有参public work方法:"+m2);
        33 得到无参数私有方法        
        Method m3 = c1.getDeclaredMethod("sleep", new Class[]{});
        System.out.println("无参的私有方法:"+m3);
        
        
        3.4 使用放射方法来调用
        Person p1 = new Person("张三",18);
        Person p2 = new Person("李四",18);
        
        m1.invoke(p1,null);// => p1.work()
        m1.invoke(p2,null);// => p2.work()
        m2.invoke(p1,"java代码");//=> p1.work码"("java代)
        m2.invoke(p2,"c++代码");// => p2.work("c++代码")
        
        m3.setAccessible(true);
        m3.invoke(p1,null);
        m3.invoke(p2,null);
        
        // 静态方法        
        Method m4 = c1.getMethod("show", new Class[]{});
        m4.invoke(null, null);// Person.show();

五.获得Field字段

       1. 得到公开的字段
        Field[] fields1 = c1.getFields();
        System.out.println("公开:");
        for(int i=0;i<fields1.length;i++)
        {
            System.out.println(fields1[i].toGenericString());
        }
        
        2. 得到所有的字段
        System.out.println("所有:");
        Field[] fields2 = c1.getDeclaredFields();
        for(int i=0;i<fields2.length;i++)
        {
            System.out.println(fields2[i].toGenericString());
        }
        
        4. 得到某个字段对象
        Field f1 = c1.getField("name");
        Field f2 = c1.getDeclaredField("age");
        f2.setAccessible(true);
        
        5. 反射机制修改某个对象的字段的值
        Person p1 =new Person("张三",18);
        Person p2 =new Person("李四",19);
        
        // 反射机制设置对象的值
        f1.set(p1, "张三丰");// p1.name = "张三丰"
        f2.set(p2, 20);// p2.age = 20
        
        // 反射机制获取对象的值 
        System.out.println(f1.get(p1));// p1.getName()
        System.out.println(f2.get(p1));// p2.getAge()

猜你喜欢

转载自blog.csdn.net/qq_15204179/article/details/81869738