JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里。
以下介绍3种方式获得class文件的对象。(ps:我是自己写了一个Person类)
方式1:通过对象获取class文件的对象
public static void function_1(){
Person person=new Person();
Class clazz=person.getClass();
System.out.println(clazz);
}
方式2:通过类名直接获取class文件的对象
public static void function_2(){
Class person=Person.class;
System.out.println(person);
}
方式3:通过静态方法获取 Class文件的对象
public static void function_3() throws Exception{
Class person=Class.forName("demo4.Person");
System.out.println(person);
}
下面再来介绍一下利用java的反射机制获取类中的多有公共构造方法
public static void function_3() throws Exception{
//获取class文件的对象
Class person=Class.forName("demo4.Person");
//获取Person类中的所有公共构造方法
Constructor[] cons=person.getConstructors();
//利用增强for循环对获得的方法进行遍历并且输出
for(Constructor con:cons){
System.out.println(con);
}
System.out.println("============");
//获取的是Person类中的指定构造方法
Constructor c=person.getConstructor(String.class,int.class);
Object obj=c.newInstance("小明",10);
System.out.println(obj);
}
java中的反射机制有很大的用处,它还带有很多的方法,我在这里就不一一赘述了。 其中我还想继续描述的就是反射擦除。以集合为例。在ArrayList<String>中,我们首先存储的是String类的变量,但是如果我们想存储Integer类型的变量,直接使用add()方法是不行的,这时我们必须使用反射擦除。
//反射擦除
public static void function_6() throws Exception{
List<String> list=new ArrayList<String>();
list.add("小明");
list.add("小红");
System.out.println(list);
System.out.println("===========");
Class clazz=list.getClass();
//获取ArrayList中的方法add()
Method method=clazz.getMethod("add", Object.class);
//运行List.add()
method.invoke(list, 2);
System.out.println(list);
}