获取class对象的方式有哪些?
方式一:通过对象获得
—— 已知某个类的实例,调用该实例的getClass()方法获得Class对象
Class aClass1 = student.getClass();
方式二:.forName获得
——已知一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()方法获取,但需抛出异常
Class aClass2 = Class.forName("com.reflection.Student");
方式三:类名.class获得
——若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
Class<Student> aClass3 = Student.class;
eg:
public class TestClassObject {
public static void main(String[] args) throws ClassNotFoundException {
//通过类的对象获取Class对象
Student student = new Student();//类的对象
Class c = student.getClass();//类对象(Class对象,保存了Student.class这个文件的所有信息)
System.out.println(c.getName());
//通过类名获取类对象
Class c2 = Student.class;
System.out.println(c2.getName());
//通过静态方法获取类对象 “包名.类名”
Class c3 = Class.forName("classfanshe.Dog");
System.out.println(c3.getName());
}
}
class Student{
}
class Dog{
}
~
~
基本内置类型的包装类都有一个Type属性
Class<Integer> aClass4 = Integer.class;
获得父类类型的方式
Class superclass = aClass1.getSuperclass();
~
~
~
实例代码演示
/**
* 测试class类的创建方式有哪些
*/
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
//new一个对象
Person student = new Student();
System.out.println("这个人是:"+student);
/*已知某个类的实例,调用该实例的getClass()方法获得Class对象*/
System.out.println("--------------方式一:通过对象获得 ---------------");
Class<? extends Person> aClass1 = student.getClass();
System.out.println(aClass1.hashCode());
/*已知一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()方法获取,但需抛出异常*/
System.out.println("--------------方式二:forname获得---------------");
Class<?> aClass2 = Class.forName("com.niuyun.reflection.Student");
System.out.println(aClass2.hashCode());
/*若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高*/
System.out.println("--------------方式三:通过<类名.Class>获得--------------");
Class<Student> aClass3 = Student.class;
System.out.println(aClass3.hashCode());
System.out.println("--------------方式四:基本内置类型的包装类都有一个Type属性--------------");
Class<Integer> aClass4 = Integer.class;
System.out.println(aClass4);
System.out.println(aClass4.hashCode());
System.out.println("--------------获得父类类型——方式--------------");
Class<?> superclass = aClass1.getSuperclass();
System.out.println(superclass);
}
}
/**
*Person类
*/
class Person{
String name;
//无参构造
public Person() {
}
//有参构造
public Person(int id, String name, int age) {
this.name = name;
}
//get(),set()方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
//Student继承Person类
class Student extends Person{
public Student(){
this.name="niuyun";
}
}
//Teacher继承Person类
class Teacher extends Person{
public Teacher(){
this.name="niuyun";
}
}
运行结果:
这个人是:Person{name='niuyun'}
--------------方式一:通过对象获得 ---------------
1163157884
--------------方式二:forname获得---------------
1163157884
--------------方式三:通过<类名.Class>获得--------------
1163157884
--------------方式四:基本内置类型的包装类都有一个Type属性--------------
class java.lang.Integer
1956725890
--------------获得父类类型——方式--------------
class com.niuyun.reflection.Person