Android

反射

2019-04-19  本文已影响0人  习惯了_就好
实体类
public class Student {

    public Student() {
        Log.e("!!!!!!!!!!!!!!!", "无参默认构造方法");
    }

    public Student(String str) {
        Log.e("!!!!!!!!!!!!!!!", "带参默认构造方法,参数为:" + str);
    }

    //有一个参数的构造方法
    public Student(char name) {
        Log.e("!!!!!!!!!!!!!!!", "姓名:" + name);
    }

    //有多个参数的构造方法
    public Student(String name, int age) {
        Log.e("!!!!!!!!!!!!!!!", "姓名:" + name + "年龄:" + age);
    }

    //受保护的构造方法
    protected Student(boolean n) {
        Log.e("!!!!!!!!!!!!!!!", "受保护的构造方法 n = " + n);
    }

    //私有构造方法
    private Student(int age) {
        Log.e("!!!!!!!!!!!!!!!", "私有的构造方法   年龄:" + age);
    }


    public String name;
    protected int age;
    char sex;
    private String phoneNum;


    public void show1(String s) {
        Log.e("!!!!!!!!!!!!!!!", "调用了:公有的,String参数的show1(): s = " + s);
    }

    protected void show2() {
        Log.e("!!!!!!!!!!!!!!!", "调用了:受保护的,无参的show2()");
    }

    void show3() {
        Log.e("!!!!!!!!!!!!!!!", "调用了:默认的,无参的show3()");
    }

    private String show4(int age) {
        Log.e("!!!!!!!!!!!!!!!", "调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
        return "abcd";
    }
    private static String show5(int age) {
        Log.e("!!!!!!!!!!!!!!!", "调用了,私有的静态的,并且有返回值的,int参数的show5(): age = " + age);
        return "abcd";
    }

    @Override
    public String toString() {
        return "neme:" + name + "\nage:" + age + "\nsex:" + sex + "\nphoneNum:" + phoneNum;
    }
}
        Log.e("!!!!!!!!!!!!!!!", "获取class的4中方式");
        //第一种通过对象获取class的方法
        Student student = new Student();
        Class clazz = student.getClass();
        Log.e("!!!!!!!!!!!!!!!", clazz.getName());

//        String str = "abc";
//        Class clazz1 = str.getClass();
//        Log.e("!!!!!!!!!!!!!!!", clazz1.getName());

        //第二种通过class属性获取class的方法
        Class clazz2 = Student.class;
//        Class clazz2 = String.class;
        Log.e("!!!!!!!!!!!!!!!", clazz2.getName());

        //第三种通过Class.forName获取class的方法
        try {
            Class clazz3 = Class.forName("song.test.com.myapplication.reflect.Student");
            Log.e("!!!!!!!!!!!!!!!", clazz3.getName());

            if (clazz == clazz2 && clazz == clazz3) {
                Log.e("!!!!!!!!!!!!!!!", "三种方式获取到的是同一个class对象");
            } else {
                Log.e("!!!!!!!!!!!!!!!", "三种方式获取到的不是同一个class对象");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //第四种通过TYPE属性获取class的方法,基本数据类型都有TYPE属性。
        //Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。String 是个对象,是引用类型.
        Class clazz4 = Integer.TYPE;
        Class clazz5 = Boolean.TYPE;
        Log.e("!!!!!!!!!!!!!!!", clazz4.getName());
        //获取构造函数
        try {
            Class clazz = Class.forName("song.test.com.myapplication.reflect.Student");

            //获取所有构造函数,共有,私有,保护,默认类型
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取所有构造函数");
            Constructor[] constructors1 = clazz.getDeclaredConstructors();
            for (int i = 0; i < constructors1.length; i++) {
                //获取修饰域
                int mode = constructors1[i].getModifiers();
                Log.e("!!!!!!!!!!!!!!!", "" + mode);
                Class[] parameterTypes = constructors1[i].getParameterTypes();
                for (int j = 0; j < parameterTypes.length; j++) {
                    Log.e("!!!!!!!!!!!!!!!", parameterTypes[j].getName());
                }
                Log.e("!!!!!!!!!!!!!!!", constructors1[i].toString());
            }

            //获取公有构造函数
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取所有公有构造函数");
            Constructor[] constructors = clazz.getConstructors();
            for (Constructor constructor : constructors) {
                Log.e("!!!!!!!!!!!!!!!", constructor.toString());
            }

            //获取公有无参构造函数
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取公有无参构造函数");
            Constructor constructor = clazz.getConstructor();
            Log.e("!!!!!!!!!!!!!!!", constructor.toString());
            Constructor constructor2 = clazz.getDeclaredConstructor();
            Log.e("!!!!!!!!!!!!!!!", constructor2.toString());

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取公有有参构造函数");
            Constructor constructor3 = clazz.getDeclaredConstructor(String.class,Integer.class);
            Log.e("!!!!!!!!!!!!!!!", constructor3.toString());

            //获取私有构造函数
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取私有构造函数");
            Constructor constructor1 = clazz.getDeclaredConstructor(Integer.class);
            Log.e("!!!!!!!!!!!!!!!", constructor1.toString());
            constructor1.setAccessible(true);//暴力访问私有方法

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "通过构造函数得到类的实例");
            //通过构造函数得到类的实例
            Object object = constructor1.newInstance("18");
            Log.e("!!!!!!!!!!!!!!!", object.toString());

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "如果构造函数是无参的,可以直接使用Class的newInstance方法");
            //如果构造函数是无参的,可以直接使用Class的newInstance方法
            Object object1 = clazz.newInstance();
            Log.e("!!!!!!!!!!!!!!!", object1.toString());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //获取方法
        try {
            Class clazz = Class.forName("song.test.com.myapplication.reflect.Student");

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取所有方法包括私有的");
            Method[] methods2 = clazz.getDeclaredMethods();
            for (Method method : methods2) {
                Log.e("!!!!!!!!!!!!!!!", methods2.toString());
            }

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取所有公共方法");
            //获取所有公共方法
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                Log.e("!!!!!!!!!!!!!!!", method.toString());
            }

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取公有的show1()方法");
            Method method = clazz.getMethod("show1", String.class);
            Log.e("!!!!!!!!!!!!!!!", method.toString());

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取私有的show4()方法");
            Method method2 = clazz.getMethod("show4", Integer.class);
            method2.setAccessible(true);
            Log.e("!!!!!!!!!!!!!!!", method2.toString());

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "调用show4函数");
            Object object = clazz.newInstance();
            method2.setAccessible(true);
            String result = (String) method2.invoke(object, 12);
            Log.e("!!!!!!!!!!!!!!!", result);


            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取私有的静态的show5()方法");
            Method method3 = clazz.getMethod("show5", Integer.class);
            method3.setAccessible(true);
            Log.e("!!!!!!!!!!!!!!!", method3.toString());
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "调用show5函数");
            Object object1 = clazz.newInstance();
            method3.setAccessible(true);
            String result1 = (String) method3.invoke(object1, 12);
            Log.e("!!!!!!!!!!!!!!!", result1);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //获取属性
        try {
            Class clazz = Class.forName("song.test.com.myapplication.reflect.Student");

            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取共有属性");
            Field[] fields = clazz.getFields();
            for (Field field : fields) {
                Log.e("!!!!!!!!!!!!!!!", field.toString());
            }

            //获取所有属性,共有,私有,保护,默认类型
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取所有属性");
            Field[] fields1 = clazz.getDeclaredFields();
            for (Field field : fields1) {
                Log.e("!!!!!!!!!!!!!!!", field.toString());
            }

            Object object = clazz.newInstance();

            //获取单个公有字段
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取单个公有字段");
            Field field = clazz.getField("name");
            field.set(object, "张三");//这次修改只对当前对象有效
            Student student = (Student) object;
            Log.e("!!!!!!!!!!!!!!!", student.name);

            //获取单个私有字段
            Log.e("!!!!!!!!!!!!!!!!!!!!!!!", "获取单个私有字段");
            Field field1 = clazz.getDeclaredField("phoneNum");
            field1.setAccessible(true);
            field1.set(object, "123456");
            Log.e("!!!!!!!!!!!!!!!", student.toString());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
上一篇 下一篇

猜你喜欢

热点阅读