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()) );
}
}