Class类
阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的
获取Class对象的三种方式
方式一: 通过Object类中的getObject()方法
Person p = new Person();
Class c = p.getClass();
方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。
Class c2 = Person.class;
方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。
Class c3 = Class.forName("Person");
注意:第三种和前两种的区别
前两种你必须明确Person类型.
后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了
代码演示
package cn.learn.demo1;
/*
* 获取一个类的class文件对象的三种方式
* 1. 对象获取
* 2. 类名获取
* 3. Class类的静态方法获取
*/
public class ReflectDemo {
public static void main(String[] args)throws ClassNotFoundException {
//1. 对象获取
Person p = new Person();
//调用Person类的父类的方法 getClass
Class c = p.getClass();
System.out.println(c);
//2. 类名获取
//每个类型,包括基本和引用,都会赋予这个类型一个静态的属性,属性名字class
Class c1 = Person.class;
System.out.println(c1);
//3. Class类的静态方法获取 forName(字符串的类名)包名.类名
Class c2 = Class.forName("cn.learn.demo1.Person");
System.out.println(c2);
}
}
Person类
package cn.learn.demo1;
public class Person {
public String name;
private int age;
/*static{
System.out.println("静态代码块");
}*/
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
private Person(int age,String name){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("人吃饭");
}
public void sleep(String s, int a,double d){
System.out.println("人在睡觉"+s+"....."+a+"....."+d);
}
private void playGame(){
System.out.println("人在打游戏");
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}