package com.aowin.getclass;
//RTTI:运行时刻类型判定
//两种形式的rtti
//1.传统的rtti
//2.反射机制(reflection)
//反射:通过对象获取类的信息,作用:
//1.反射创建对象
//2.分析类的结构
//反射机制的源头是Class对象
//Class类和Class对象
//Class对象是对类的描述,每一个类都有一个Class对象,刚开始保存在同名的.class文件(在类编译通过后产生)中,随类的第一次加载而加载
//Class对象对于每一个类有且只有一个
//Class类是Class对象所属的类,它的构造方法被私有化了
//获取Class对象的方式有3种:
//1.通过对象.getClass()方法
//2.通过Class类中的静态的forName(参数)方法
//3.通过类名.class字面量
//注意:
//1.三种方式获得的Class对象是同一个
//2.class字面量可用于基本数据类型
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Object obj = new Student(1001);
//获取Class对象的第一种方式,通过getClass()方法,需要提前创建类的一个对象
Class c1 = obj.getClass(); //获取obj对象所属类的Class对象
String name = c1.getName(); //获得Class对象表示的类的类名
System.out.println(name);
System.out.println(c1);
//获取Class对象的第二种方式,通过Class类中的静态的forName(参数)方法
//参数是包含完整类名(包名.类名)的字符串
//多用在加载驱动的时候,不需要提前创建对象
Class c2 = Class.forName("com.aowin.getclass.Student");
System.out.println(c2);
//获取Class对象的第三种方式,通过class字面量,基本类型也可以使用class字面量
//多用于参数的传递
Class c3 = Student.class;
System.out.println(c3);
System.out.println(double.class);
//三种方式获得的Student类的Class对象是同一个
System.out.println(c1==c2); //true
System.out.println(c2==c3); //true
System.out.println(c1==c3); //true
}
}
package com.aowin.getclass;
public class Person {
public String color;
}
package com.aowin.getclass;
public class Student extends Person{
//成员变量
String name;
private int age;
public int id;
//构造方法
public Student(){
}
public Student(int id){
this.id = id;
}
private Student(String name, int age){
this.name = name;
this.age = age;
}
//setter,getter
//学习
public void study(){
System.out.println("学习....");
}
public void study(int hour){
System.out.println("学了"+hour+"小时");
}
//睡觉
private void sleep(){
System.out.println("睡觉...");
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", id=" + id + "]";
}
}