反射
反射概述
Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
获取Class类的对象
要想通过反射去使用一个类,首先要获取到该类的字节码文件对象,也就是类型为Class类型的对象
获取Class类型的对象的三种方式:
- 使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
- 调用对象的getClass()方法,返回该对象所属类对应的Class对象
- 该方法是Object类中的方法,所有的Java对象都可以调用该方法
- 使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
public class Student {
//成员变量:一个私有,一个默认,一个公共
private String name;
int age;
public String address;
//构造方法:一个私有,一个默认,两个公共
public Student(){
}
private Student(String name){
this.name = name;
}
Student(String name,int age){
this.name=name;
this.age=age;
}
public Student(String name,int age,String address){
this.name=name;
this.address=address;
this.age=age;
}
//成员方法:一个私有,四个公共
private void function(){
System.out.println("function");
}
public void method1(){
System.out.println("method");
}
public void method2(String s){
System.out.println("method"+s);
}
public String method3(String s,int i){
return s+","+i;
}
@Override
public String toString() {
return "Student{"+
"name="+name+'\''+
",age="+age+
",address="+address+'\''+
'}';
}
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);//class day2.Student
Class<Student> c2 = Student.class;
System.out.println(c2==c1);//true
System.out.println("..........");
//调用对象的getClass()方法,返回该对象所属类对应的Class对象
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c1==c3);//true
System.out.println("..........");
//用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
Class<?> c4 = Class.forName("day2.Student");
System.out.println(c1==c4);//true
}
}
为了测试可以用前两种,为了灵活性可以用最后一种。
反射获取构造方法并使用
Class类中用于获取构造方法的方法
- Constructor<?>[] getConstructors () 返回所有公共构造方法对象的数组
- Constructor<?>[] getDeclaredConstructors() 返回所有公共构造方法对象的数组
- Constructor<?>[] getConstructor (Class<?>… parameterTypes) 返回单个公共构造方法对象的数组
- Constructor<?>[] getDeclaredConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象的数组
Constructor类中用于创建对象的方法
- T newInstance(Object… initargs):根据指定的构造方法创建对象
public class ReflectDemo01 {
public static void main(String[] args)