获得class对象的方式有哪些?

获取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

~~~感谢您的光临~~

posted @   牛·云说  阅读(469)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示