学习好反射是我们要进一步学习框架的重要基础。
在这里我们要学习到如何获取一个类的反射,如何反射到一个类的字段、成员方法、构造方法.
下面要用到的一些代码:
package cn.liao;
public class Animal {
public String name="aaa";
private int weight=123;
public static int size=12;
public Animal(){
System.out.println("Animal");
}
public Animal(String name){
System.out.println(name);
}
public Animal(String name,int weight){
System.out.println(name+","+weight);
}
private Animal(List list){
System.out.println(list);
}
public void f1(){
System.out.println("f1 null");
}
public void f1(String name){
System.out.println(name);
}
public void f1(String name,char[] passwd){
System.out.println(name+":"+passwd);
}
private int[] f1(int[]passwd){
return passwd;
}
public static void f1(int passwd){
System.out.println(passwd);
}
public static void main(String[]args){
System.out.println("main");
}
}
反射类的关键字是 Class 注意区别于小写的class
1.获取到一个类的反射(有三种方式)
以上面代码中的类为例:
a.第一种方式
Class clazz=Class.forName("cn.liao.Animal");//一般使用这种传统的方式
在这里有一些需要我们注意的地方:forName()方法中要接收的参数是我们要反射的类所在包的完整路径,我们需要加上这个类所在的包的包名。
b.第二种方式
Class clazz=new Animal().getClass();
c.第三种方式
Class clazz=Animal.class;
2.反射一个类的构造方法
a. 获取Animal类的一个无参的构造函数,并利用获得的构造器new 一个对象
Constructor c=clazz.getConstructor(null);//注意当没有参数时,写null,不能为空
Animal an=(Animal) c.newInstance(null);//因为构造函数无参,所以写null;因为newInstance()方法返回的是一个Object对象,所以需要强转
System.out.println(an.name);
b.在这里获取的是一个带有String类型参数的构造函数
Constructor c=clazz.getConstructor(String.class);//接收String类型的参数
Animal an=(Animal) c.newInstance("xxx");//给接收String类型的构造函数传递一个具体的String类型的值
System.out.println(an.name);
c.注意:当接收一个int基本类型参数时,也是写 基本类型名称.class
Constructor c=clazz.getConstructor(String.class,int.class);//接收两个参数,一个为String,另一个为int型
Animal an=(Animal) c.newInstance("xxx",12);
System.out.println(an.name);
d.注意:getConstructor()和getDeclaredConstructor()的区别:
//getConstructor()只能获取被public修饰的构造函数
//getDeclaredConstructor()可以获取任何权限的构造函数
Constructor c=clazz.getDeclaredConstructor(List.class);
//我们知道当构造函数为private时,那么就不能用这个构造函数new对象,但是在反射中却可以访问
//被private修饰的构造函数
c.setAccessible(true);//暴力反射,就可以使得private方法可以被允许访问,这也是面试当中会遇到的。
Animal an=(Animal) c.newInstance(new ArrayList());
System.out.println(an.name);
e.补充
//这段代码相当于上面的先取得空构造函数的构建器,然后再new对象
Animal an=(Animal) clazz.newInstance();
System.out.println(an.name);