反射 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
反射的作用
在运行时判断任意一个对象所属的类;
在运行时创建任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
在运行时调用任意一个对象的方法。
反射的使用
1.创建Class对象
步骤1 获取class实例
获取class的3种方法
public static void main1( String[] args) throws ClassNotFoundException{
//1.没有对象的情况
Class<?> aClass1 = Class.forName("com.Person");
}
有很多异常问题需要向外抛出(throws) 下面的方法也同样需要抛出不一样的问题
//2.有对象的情况
Person person1 = aClass3.newInstance();
System.out.println(person1);
//3.已知类的情况
Class<Person> aClass3 = Person.class;
步骤2 生成实例对象
有两种方法
// 方法一
Person person1 = aClass3.newInstance();
System.out.println(person1);
//方法二
Constructor<Person> constructor = aClass3.getConstructor(Integer.class,String.class);
Person person2 = constructor.newInstance(1,"zs");
System.out.println(person2);
2.访问属性
获取全部公有成员 Fields
public static void main2(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Class<Person> personClass = Person.class;
Constructor<Person> constructor = personClass.getConstructor(Integer.class, String.class);
Person person = constructor.newInstance(1, "zs");
/**获取全部公有成员*/
Field[] fields = personClass.getFields();
for (Field field: fields) {
/**获取值*/
Object o = field.get(person);
System.out.print(o + "-");
/**获取field对象两位成员的名字*/
String name = field.getName();
System.out.println(name);
}
获取全部私有成员 DeclaredFields
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField: declaredFields) {
declaredField.setAccessible(true);
Object o = declaredField.get(person);
System.out.println(o);
}
获取单个私有成员 DeclaredField
Field idField = personClass.getDeclaredField("id");
idField.setAccessible(true);
Object o = idField.get(person);
System.out.println(o);
3.访问方法
获取全部方法名
public static void main(String[] args){
Class<Person> personClass = Person.class;
Method[] methods = personClass.getMethods();
/**获取全部方法名 */
for (Method method: methods) {
String name = method.getName();
System.out.println(name);
}
}
获取指定下标方法名
String name =methods[2].getName();
System.out.println(name);