反射的定义
百度的得到的定义的是:
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
其中有一个有趣的点就是:可以使用所有方法和属性(包括私有的属性和方法)dui
获取class对象
- Class.forName(ClassName);通过类全名(包括包名)来获取其class对象、
- ClassName.class;也是通过类名获取对应的class对象,区别在与这个类需要导入,而第一种方法不需要导入
- ObjectName.getclass;通过对象来获取对应的class对象
class对象中的方法
与字段有关
Field[] getFields() :
Field getField(String name)
Field[] getDeclaredFields()
Field getDeclaredField(String name)
这四个方法两个特点:
- 名字中间是否有Declared,不带有这个单词的方法返回的字段只能是public关键字修饰的,而带有这个单词的方法可以是任何访问权限的字段
- 名字中带s的返回所有满足条件的filed对象,而没有带s的是指定返回一个filed对象
filed对象中的方法
1. void set(Object obj, Object value);设置一个对象中filed对象封装的字段的值
2. get(Object obj);获取一个对象中filed对象封装的字段的值
3. setAccessible(true)通过暴力反射访问非public修饰的字段
//对filter中方法的使用
import sun.plugin2.message.GetAppletMessage;
import java.lang.reflect.Field;
class Person{
public String name;
private int age;
}
public class test {
public static void main(String[] args) throws Exception {
Class aClass= Class.forName("Person");
Object o = aClass.newInstance();//相当于调用了Person中的空参构造了一个Person对象
Field[] declaredFields = aClass.getDeclaredFields();//获取person类中的所有字段
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);//暴力访问
System.out.println(declaredField.getName()+"="+declaredField.get(o));//访问对象o中字段的值
}
Field age = aClass.getDeclaredField("age");//获取指定的字段
age.setAccessible(true);//以为age是私有的需要先调用这个方法,来暴力访问
System.out.println(age.get(o));
age.set(o,12);
System.out.println(age.get(o));
}
}
与方法有关
Method[] getMethods()
Method getMethod(String name, object<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, object<?>... parameterTypes)
这个的命名规则和与字段有关的方法一样
需要注意的是因为方法使用重载机制的,所以指定一个方法不仅仅需要名字还需要指定方法的参数
method中的方法
method中最简单的方法就是调用这个方法
Object invoke(Object obj, Object… args) //前一个参数传递method对应对应类的对象,第二个参数传递的就是参数
与构造方法有关
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
命名方法同理,
Constructor
T newInstance(Object… initargs) //参数传递对应构造方法的参数