Java 反射使用总结

2018-01-25  本文已影响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()) );
        }
    }
上一篇下一篇

猜你喜欢

热点阅读