什么是反射
一般我们获取类的信息是去new一个对象,然后查看、修改它的属性或者运行它的方法。而反射不需要创建对象,就可以单独获取类的构造方法、成员变量、成员方法、main方法等信息,这些操作是通过Class对象完成的,Class类只有一个,其中包含了所有类的信息,当一个类被加载的时候,就会自动为这个类创建一个Class对象,通过这个对象,我们可以得到类的所有信息。
用反射可以干什么
1、获取一个类的所有信息。
2、获取一个接口的常量和方法声明。
3、在程序运行中加载某些类并执行它的方法。
4、在程序运行中创建一些在程序运行期间才知道名字的类的实例。
5、在程序运行期间获取或修改一些对象的成员变量。
6、在程序运行期间检测或执行一些对象的方法。
7、跳过了对象的创建环节,增加了程序的灵活性。
8、利用反射完成一些软件的配置更新操作。
加载类的几种方法
1、代码:
public void getclass()
{
//第一种方式获取Class对象
Student st = new Student(); //同时产生st对象和class对象
Class<?> stClass1=st.getClass(); //获取Class 对象
System.out.println(stClass1.getName());
//第二种,常用,字符串可以传入也可以写在配置文件中
try {
Class<?> stClass2=Class.forName("com.myf.reflect1229.Student");
System.out.println(stClass2==stClass1);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//第三种
Class<?> stClass3=Student.class;
System.out.println(stClass3==stClass1);
}
2、运行结果:
调用了公有,无参构造方法
com.myf.reflect1229.Student
true
true
3、分析:第一种方式需要先创建类的对象,然后通过对象去获取Class类,这并没有体现出反射的优点,我们一般不采用这种方法;第二种方式是最常用的,我们通过一段关于类的位置信息的字符串来加载类,获取Class对象,这样比较直接,也很方便;第三种方式是通过类来获取,虽然少了对象的创建步骤,但还是比不上第二种方法对Class对象的直接获取来的方便。所以,我们一般通过类的位置来加载类,获取Class对象。以上三种方法获取的Class对象是同一个对象。
建一个Student类
Student类包括不同访问修饰符修饰的成员变量,成员方法,构造方法,以便之后运用反射机制来操作这个类。
public class Student {
public String name;
private char gender;
protected int age;
String number;
//默认构造方法
Student(String str)
{
System.out.println("默认构造方法:s="+str);
}
//无参构造方法
public Student()
{
System.out.println("调用了公有,无参构造方法");
}
//有一个参数的构造方法
public Student(char gender)
{
System.out.println("性别:"+gender);
this.gender=gender;
}
//有多个参数的构造方法
public Student(String name ,int age)
{
System.out.println("姓名:"+name+"年龄:"+ age);
}
//受保护的构造方法
protected Student(boolean n)
{
System.out.println("受保护的构造方法:n="+n);
}
//私有的构造方法
private Student(int age)
{
System.out.println("私有的构造方法:age="+age);
}
public String toString()
{
return "name:"+name+"gender:"+gender+"age:"+age+"number:"+number;
}
/**
* 公有的方法
* @param s
*/
public void show1(String s)
{
System.out.println("调用了公有的,String参数的方法show1(),s="+s);
}
/**
* 受保护的方法
*/
protected void show2()
{
System.out.println("调用了受保护的方法show2()");
}
/**
* 私有的,int参数的,有返回值的方法
*/
private String show3(int age)
{
System.out.println("调用了私有的,int参数的,有返回值的方法show3()");
this.age=age;
return "123";
}
/**
* 默认无参无返回值的方法
*/
void show4()
{
System.out.println("默认无参,无返回值的方法")