Class类
对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个结构(class/interfacelenum/annotation/primitive type/void/)的有关信息。
Class本身也是一个类
Class对象只能由系统建立对象
一个加载的类在JVM中只会有一个Class实例
一个Class对象对应的是一个加载到JVM中的一个.class文件每个类的实例都会记得自己是由哪个Class 实例所生成通过Class可以完整地得到一个类中的所有被加载的结构
Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象
Class类的常用方法
static ClassforName(String name):
返回指定类名name的Class对象
Object newInstance():
调用缺省构造函数,返回Class对象的一个实例
getName():
返回此Class对象所表示的实体(类,接口,数组类或void)的名称。
Class getSuperClass():
返回当前Class对象的父类的Class对象
Class getinterfaces():
获取当前Class对象的接口
ClassLoader getClassLoader():
返回该类的类加载器
Constructor[getConstructors():
返回一个包含某些Constructor对象的数组
Method getMothed(String name,Class.. T):返回一个Method对象,此对象的形参类型为paramType
Field[getDeclaredFields():返回Field对象的一个数组
获取Class类的实例
1.若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高。
Class clazz= Person.class;
2.已知某个类的实例,调用该实例的getClass()方法获取Class对象
Class clazz = person.getClass();
3.已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取可能抛出ClassNotFoundException
Class clazz= Class.forName("demo01.Student");
4.内置基本数据类型可以直接用类名.Type
package 反射;
//测试class类的创建方式有哪些
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//正常方式获取对象
Persaon per=new Studen();
System.out.println(""+per);
//第一种方式来获取他的class对象:通过对象获得
Class c1=per.getClass();
System.out.println(c1.hashCode());
//第二种方式获得class对象:forname获得,当只知道包名时用这个方式
Class c2=Class.forName("反射.Studen");//填写包名类路径
System.out.println(c2.hashCode());
//第三种方式来获得他的class对象:通过类名.class,当只知道他的类名时用这个方式
Class<Studen> c3= Studen.class;
System.out.println(c3.hashCode());
//第四种方式来获得class对象:基本内置类型的包装类有一个Type属性,只有内置类型对象才有,所以这个是有一些限制的
Class<Integer> c4=Integer.TYPE;
System.out.println(c4.hashCode());//注意:因为前面几种方式的class对象是一样为Studen对象的,但是这个方式的对象和之前的不一样,因为他是直接用Integer,对象来获取的,和上们三个不一样,在这里体现出来这个方式,只是让知道怎么去使用
//获得父类类型,当我们只知道我们要获取class对象的子类时,可以用这个方式去获取他的class对象
Class c5=c1.getSuperclass();
System.out.println(c5);
}
}
class Persaon{
String name;
public Persaon(){
}
public Persaon(String name){
this.name=name;
}
public String toString(){
return "Persaon{"+"name='"+name+'\''+'}';
}
}
class Studen extends Persaon{
public Studen(){
this.name="学生";
}
}
class leacher extends Persaon{
public leacher(){
this.name="老师";
}
}