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