通过反射来获取Class类的对象
我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象
我们学习三种方式获取Class类型的对象,即有3种方式获取字节码文件的对象 1、使用类的class属性来获取该类对应的Class对象。举例: Student.class将会返回Student类对应的Class对象 2、调用对象的getClass()方法,返回该对象所属类对应的Class对象。getClass方法是Object类中的方法,所有的Java对象都可以调用该方法 3、使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径
通过反射来获取Class类对象的练习
xxxxxxxxxxpackage 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 + '\'' + '}'; }}xxxxxxxxxxpackage 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,说明第三种方式也能获取到字节码文件对象
//--------------------------------------------------------------------------------------------------------
//总结:第一种方式使用的时候最方便;第三种可以自己设置配置文件的路径,灵活性最高
}}