美文网首页
Java 反射使用总结

Java 反射使用总结

作者: 鈤汌冈板 | 来源:发表于2018-01-25 09:16 被阅读5次
    // 类
    public class Person {
        public String name;
        public boolean sex;
    
        public Person() {
            Log.e("ivan say", "getAge: 1");
        }
    
        public Person(String name) {
            this.name = name;
            Log.e("ivan say", "getAge: 2");
        }
    
        public Person(String name, boolean sex) {
            this.name = name;
            this.sex = sex;
            Log.e("ivan say", name + "sex is " + String.valueOf(sex));
        }
    
        private int getAge() {
            Log.e("ivan say", "getAge: 4");
            return 5;
        }
        private boolean isMale(int a) {
            Log.e("ivan say", "getAge: "+String.valueOf(a));
            return false;
        }
    }
    
    private void test() {
            try {
                Class<?> clazz = Class.forName("ivan.model.Person");
                //指定有参构造函数
                Constructor c = clazz.getDeclaredConstructor(String.class, boolean.class);
                /**
                 * 指定要调用的方法
                 * getDeclaredMethod 可以获得私有方法
                 * getMethod 只能获取公有方法
                 * isMale 是方法名
                 */
                Method m = clazz.getDeclaredMethod("isMale", int.class);
                //这句话告诉java 可以访问私有方法
                m.setAccessible(true);
                //调用方法
                m.invoke(c.newInstance("zhang", true), 11);
                //获取类中的各种方法、属性等
                fanshe(clazz);
            } catch (Exception e) {
                Log.e(TAG, "crash: "+ e.toString() );
            }
        }
    
    private void fanshe(Class<?> clazz) {
            Log.e(TAG, "-------------------------------- "+ "构造方法"+ "-------------------------------- ");
            //本类声明的方法
            Constructor[] cots = clazz.getConstructors();
            //包含父类声明的方法
    //            Method[] methods = Class.forName("ivan.model.Person").getMethods();
            for (int i = 0; i< cots.length; i++) {
                Log.e(TAG, "-------------------------------- "+ i+ "-------------------------------- ");
                Log.e(TAG, "构造方法所属类全名 "+ cots[i].getDeclaringClass().getName() );
                Log.e(TAG, "构造方法所属类简称: "+ cots[i].getDeclaringClass().getSimpleName() );
                Log.e(TAG, "构造方法名称+参数类型: "+ cots[i].toGenericString());
                Log.e(TAG, "构造方法全名: "+ cots[i].getName() );
                Log.e(TAG, "构造方法修饰符类型: "+ String.valueOf(cots[i].getModifiers()) );
            }
    
            Log.e(TAG, "-------------------------------- "+ "方法"+ "-------------------------------- ");
            //本类声明的方法
            Method[] methods = clazz.getDeclaredMethods();
            //包含父类声明的方法
    //            Method[] methods = Class.forName("ivan.model.Person").getMethods();
            for (int i = 0; i< methods.length; i++) {
                Log.e(TAG, "-------------------------------- "+ i+ "-------------------------------- ");
                Log.e(TAG, "方法所属类全名 "+ methods[i].getDeclaringClass().getName() );
                Log.e(TAG, "方法所属类简称: "+ methods[i].getDeclaringClass().getSimpleName() );
                Log.e(TAG, "方法返回值: "+ methods[i].getReturnType());
                Log.e(TAG, "方法全名: "+ methods[i].getName() );
                Log.e(TAG, "方法修饰符类型: "+ String.valueOf(methods[i].getModifiers()) );
            }
    
            Log.e(TAG, "-------------------------------- "+ "属性"+ "-------------------------------- ");
            //本类声明的方法
            Field[] fields = clazz.getDeclaredFields();
            //包含父类声明的方法
    //            Field[] fields = clazz.getFields();
            for (int i = 0; i< fields.length; i++) {
                Log.e(TAG, "-------------------------------- "+ i+ "-------------------------------- ");
                Log.e(TAG, "方法所属类全名 "+ fields[i].getDeclaringClass().getName() );
                Log.e(TAG, "方法所属类简称: "+ fields[i].getDeclaringClass().getSimpleName() );
                Log.e(TAG, "方法全名: "+ fields[i].getName() );
                Log.e(TAG, "方法修饰符类型: "+ String.valueOf(fields[i].getModifiers()) );
            }
        }
    

    相关文章

      网友评论

          本文标题:Java 反射使用总结

          本文链接:https://www.haomeiwen.com/subject/axvmaxtx.html