反射很重要,一定要了解基本内容
类和对象的概念
所有的类都有一个类的对象来记录基本的信息。
普通对象与类对象的区别
对于普通对象,通常具有同一个类的属性和相同的方法名称
类对象主要存储的式一个类的属性和方法,即描述一种类有那些对象有那些方法
获取类对象
获取类对象的方式
- class.forName
- hero.class
- new hero().getclass()
在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
注意:这里是指在一个类加载器一种类只有一个对象,在JVM中只有一个类加载器
package com.fanshe;
import com.fanshe.Hero;
public class domo {
public static void main(String[] args) {
try {
Class pClass1=Class.forName("com.fanshe.Hero");
Class pClass2=Hero.class;
Class pClass3=new Hero().getClass();
System.out.println(pClass1==pClass2);
System.out.println(pClass1==pClass3);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
获取类的对象的时候会导致类的属性进行初始化
与传统的通过new 来获取对象的方式不同
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象
package reflection;
import java.lang.reflect.Constructor;
import charactor.Hero;
public class TestReflection {
public static void main(String[] args) {
//传统的使用new的方式创建对象
Hero h1 =new Hero();
h1.name = "teemo";
System.out.println(h1);
try {
//使用反射的方式创建对象
String className = "charactor.Hero";
//类对象
Class pClass=Class.forName(className);
//构造器
Constructor c= pClass.getConstructor();
//通过构造器实例化
Hero h2= (Hero) c.newInstance();
h2.name="gareen";
System.out.println(h2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}