通过反射来获取Class类的对象
我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象
我们学习三种方式获取Class类型的对象,即有3种方式获取字节码文件的对象 1、使用类的class属性来获取该类对应的Class对象。举例: Student.class将会返回Student类对应的Class对象 2、调用对象的getClass()方法,返回该对象所属类对应的Class对象。getClass方法是Object类中的方法,所有的Java对象都可以调用该方法 3、使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
通过反射来获取Class类对象的练习
xxxxxxxxxx
package ch27;
public class a_4_1Student {
//成员变量:私有、默认、公共
private String name;
int age;
public String address;
//公共构造方法
public a_4_1Student() {
}
//私有构造方法
private a_4_1Student(String name) {
this.name = name;
}
//默认构造方法
a_4_1Student(String name, int age) {
this.name = name;
this.age = age;
}
//公共构造方法
public a_4_1Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//私有成员方法
private void function(){
System.out.println("function");
}
//4个公共成员方法
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;
}
//重写的toString方法也是公共成员方法
public String toString() {
return "a_4_1Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
xxxxxxxxxx
package ch27;
public class a_4_2测试 {
//我们学习三种方式获取Class类型的对象,即有3种方式获取字节码文件的对象
//1、使用类的class属性来获取该类对应的Class对象。举例: Student.class将会返回Student类对应的Class对象
//2、调用对象的getClass()方法,返回该对象所属类对应的Class对象。getClass方法是Object类中的方法,所有的Java对象都可以调用该方法
//3、使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
public static void main(String[] args) throws ClassNotFoundException {
//1、使用类的class属性来获取该类对应的Class对象
Class<a_4_1Student> c1 = a_4_1Student.class;//右边的返回值是Class类,该Class类是泛型类,里面的数据是a_4_1Student类型的
//上面那行右边获取的是a_4_1Student类的字节码文件
System.out.println(c1);//输出class ch27.a_4_1Student
//当我们把学生类再生成一个字节码文件,即学生类有了两个字节码文件,会冲突报错吗,如果不会的话,那c2和上面的c1相等吗
Class<a_4_1Student> c2 = a_4_1Student.class;
System.out.println(c2==c2);//输出true
System.out.println("------------------");
//-------------------------------------------------------------------------------------------------------
//2、调用对象的getClass()方法,返回该对象所属类对应的Class对象
a_4_1Student s = new a_4_1Student();
Class<? extends a_4_1Student> c3 = s.getClass();//生成左边的快捷键:Ctrl+Alt+v
System.out.println(c1==c3);//输出true,说明第二种方式也能获取到字节码文件对象
System.out.println("------------------");
//-------------------------------------------------------------------------------------------------------
//3、使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("ch27.a_4_1Student");//右边的字符串是全路径(格式是:包.类)。forName报红线,Alt+Enter,Add抛出异常
//由于说明那行不知道右边的路径里放的是哪个包下的哪个类,所以左边的泛型是?,?表示泛型通配符
System.out.println(c1==c4);//输出true,说明第三种方式也能获取到字节码文件对象
//--------------------------------------------------------------------------------------------------------
//总结:第一种方式使用的时候最方便;第三种可以自己设置配置文件的路径,灵活性最高
}
}