您的位置:首页

Class类和ClassLoader类的简单介绍

2018-04-29 11:02 309 查看
反射机制中的Class

Class内部到底有什么呢?看下图!

代码:
  Class cls=Person.class;



1、Class类:
1、  对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含可特定的某个类的有关信息。

2、Class对象只能由系统建立对象。

3、一个类在JVM中只会有一个Class实例。

4、每个类的实例都会记得自己是由哪个Class实例产生的。

5、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!

2、得到Class对象【三种方法】

1、直接通过: 类名.class

Class cls=Person.class;

2、getClass()方式

Object obj=new Person();
Class cls2=obj.getClass();

3、Class.forName("包名.类名")【最常用】【框架使用的最多】
try {
Class cls3=Class.forName("cn.sgg.reflections.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
3、反射中的泛型
举例:
Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

//?表示任意对象类型

4、Class类中的方法

1、创建类的实例的方法:newInstance()

Class cls3=Class.forName("cn.sgg.reflections.Person");

Object obj=cls3.newInstance();//得到实例(通过:无参构造器)

Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)

说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)

2、Field<------>classType.getDeclaredFields();

3、Method<----->getDeclaredMethod(getMethodName, new Class[]{});

4、Constructor<------>getConstructor(new Class[]{int.class,String.class});

5、反射的在哪里被使用?

框架中:
      Servlet、Strust2等基础框架中......

6、类加载器:ClassLoader

说明:
ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。

启动类装载器(bootstap)

用户自定义装载器(user-defined class loader)。

JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,

如下图:

BootStrap(启动类加载器) :负责加载 jdk.../jre/lib/xxx.jar (例如:rt.jar)或者被 -Xbootclasspath参数指定的路径的jar
extension classloader(扩展类加载器)  加载 jdk.../jre/lib/ext/xxx.jar 或者 java.ext.dirs指定的路径的类库
system(application) classloader(应用程序加载器或者系统类加载器):  负责加载用户类路径(ClassPath)上指定的类库。




举例:
1、//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println(classLoader);

2、//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println("系统加载器:"+classLoader);

3、//获取系统类加载器的父类的加载器
ClassLoader parentLoader=classLoader.getParent();
System.out.println("系统加载器的父类加载器:"+classLoader);

4、//获取扩展类加载器的父类加载器
classLoader=parentLoader.getParent();
System.out.println("扩展类加载器的父类加载器:"+classLoader);

5、//检测当前类是由哪个类加载器加载的
try {
ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
System.out.println(classLoader2);

} catch (ClassNotFoundException e) {
e.printStackTrace();
}

6、//检测JDK 提供的Object类由哪个类加载器负责加载的
ClassLoader classLoader3;
try {
classLoader3 = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

7、关于类加载器的一个重要方法:

系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀

举例:
//关于类加载器的一个重要方法:
InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");


测试代码:

package cn.sgg.reflections;

/**
*  反射--被测试类:
*/
public class Person {
String name;
private int age;

public Person(){}
public Person(String name){
this.name=name;
}
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;
}
}


package cn.sgg.reflections;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;

/**
* 反射-测试类:
*
*/
public class TestReflect {

public static void main(String[] args) {
new TestReflect().testClassLoader();
}

/**
* 测试反射的方法
*/
static void  getProperty(){

//1、得到Class对象
Class cls=Person.class;

Field[] fields=cls.getDeclaredFields();
//2、得到Class对象
Object obj=new Person();
Class cls2=obj.getClass();
//3、得到Class对象
try {
Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

//获得类实例
Object obj1=cls3.newInstance();

} catch (Exception e) {
e.printStackTrace();
}
}

static void testClassLoader(){

//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println("系统加载器:"+classLoader);

//获取系统类加载器的父类的加载器
ClassLoader parentLoader=classLoader.getParent();
System.out.println("系统加载器的父类加载器:"+classLoader);

//获取扩展类加载器的父类加载器
classLoader=parentLoader.getParent();
System.out.println("扩展类加载器的父类加载器:"+classLoader);

//检测当前类是由哪个类加载器加载的
try {
ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
System.out.println(classLoader2);

} catch (ClassNotFoundException e) {
e.printStackTrace();
}

//检测JDK 提供的Object类由哪个类加载器负责加载的
ClassLoader classLoader3;
try {
classLoader3 = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

//关于类加载器的一个重要方法:
InputStream in=null;
in=TestReflect.class.getResourceAsStream("xxxx.txt");
}
}


系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
扩展类加载器的父类加载器:null
sun.misc.Launcher$AppClassLoader@18d107f
null
得到图片的刘对象:null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: