import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class MyClassLoader extends ClassLoader{ private String name;//类加载器的名字 private String path = "F:\\";//加载类的路径 private static final String fileType = ".class";//文件的扩展名 public MyClassLoader(String name){ super();//显式地调用父类构造器,将该加载器的父加载器设置为默认的系统加载器 this.name = name; } public MyClassLoader(ClassLoader parent,String name){ super(parent);//设置该加载器的父加载器 this.name = name; } //将java文件中的数据存储到字节数组中 private byte[] loadClassData(String name){ byte[] data = null;//存储字节码 InputStream ips = null; ByteArrayOutputStream baos = null; try{ String cname = name.replace(".", "\\");//获取正确的路径格式 ips = new FileInputStream(new File(path+cname+fileType)); baos = new ByteArrayOutputStream(); int ch = 0; while(-1 != (ch = ips.read()) ){ baos.write(ch);//从文件输入流中读取数据,将读到的数据写到字节数组输出流中 } data = baos.toByteArray(); ips.close(); baos.close();//关闭输入输出流 }catch(Exception ep){ ep.printStackTrace(); } return data; } //获取Class对象 public Class<?> findClass(String name) throws ClassNotFoundException { byte[] data = this.loadClassData(name); return this.defineClass(name, data, 0, data.length); } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String toString(){ return this.name; } //测试方法 public static void test(ClassLoader loader) throws Exception{ Class<?> c = loader.loadClass("First"); c.newInstance(); } public static void main(String[] args) throws Exception { MyClassLoader loader1 = new MyClassLoader("loader1"); loader1.setPath("F:\\myapp\\loader1\\"); MyClassLoader loader2 = new MyClassLoader(loader1,"loader2"); loader2.setPath("F:\\myapp\\loader2\\"); test(loader1); test(loader2); } }
public class First { public First(){ System.out.println("First的类加载器是:"+this.getClass().getClassLoader()); new Second(); } }
public class Second { public Second(){ System.out.println("Second的类加载器是:"+this.getClass().getClassLoader()); } }
您还没有登录,请您登录后再发表评论
原生类加载器主要负责加载Java API类,而自定义类加载器则可以根据应用程序的需求加载特定的类,例如从网络、数据库或其他非标准位置加载。 `Class`对象提供了多种方法来获取类型信息,如`forName()`用于根据类名...
在JVM生命周期方面,从启动一个Java程序到程序运行过程中,JVM实例与独立运行的Java程序相对应,具有进程级别的生命周期。 面向对象的知识点涉及UML表示法和设计模式。UML表示法小结中包括类图、顺序图、活动图和...
RTTI在Java中主要通过两种形式存在:一种是传统的类型转换,也就是instanceof关键字和类的cast方法;另一种是反射机制。RTTI的实现依赖于Java类模型中的Class类,它是所有类的最终父类,每个类在运行时都会有一个...
- **类加载过程**:当Java类被加载到JVM时,类加载器负责构建该类的方法表。 - **动态绑定**:Java中的方法调用分为静态绑定(如静态方法调用)和动态绑定(如实例方法调用)。动态绑定是指在运行时根据对象的实际...
每个类都有一个Class对象,类加载器(ClassLoader)在类首次被加载到JVM时创建这个对象。通过Class对象,可以获取关于类的详细信息,比如构造函数、成员变量、方法等。 在Java中,Class类实现了Serializable、...
每个 Java 类运⾏时都在 JVM ⾥表现为⼀个 Class 对象,可以通过类名.class、类型.getClass()、Class.forName("类名") 等方法获取 Class 对象。 二、Class 类 Class 类是 Java 反射机制的核心。它提供了多种方法来...
- 每个类加载到JVM时,JVM会为该类创建一个`Class`对象。 - 对于所有实例化的对象,它们共享同一个`Class`对象。 - `Class`对象提供了一种访问类内部结构的方式,包括方法、字段、构造器等。 2. **Class对象的...
1. JAVA 使用 Class 对象来执行 RTTI(RunTime Type Information),创建这个类的实例。 2. 验证同一个类的多个对象的Class对象是一个。 获取 Class 对象有多种方式: 1. 通过 Class 的 forName(String name) 方法...
连接池预先创建了一组数据库连接,当应用程序请求数据库访问时,直接从池中获取一个已建立的连接,使用完毕后归还到池中,避免了每次访问数据库都要新建和销毁连接的开销。JDBC驱动是Java应用程序与数据库通信的桥梁...
3. **注解(Annotation)**:注解是Java提供的一种元数据,提供了在编译时或运行时向编译器和JVM传递信息的方式。例如,`@Override`注解表示方法是重写父类方法,`@Deprecated`表示方法或类已过时。学习注解可以参考...
对于那些从C++转向Java的开发者来说,了解这两种语言之间的差异至关重要。本文将深入探讨C++与Java的主要区别,并特别关注多态性的不同实现方式。 #### 1. 指针支持 - **C++**: 支持指针操作,这为开发者提供了...
当类被首次使用(例如,通过创建实例或访问静态成员)时,JVM的类加载器会加载对应的Class对象。 Class对象可以通过多种方式获取: 1. 使用`Class.forName(String className)`方法,传入类的全限定名,例如`Class....
运行时类型识别(RTTI)通过`instanceof`关键字和`getClass()`方法提供了一种检查对象实际类型的方式,从而安全地执行向下类型转换。 #### 八、多态的陷阱:置换私有方法 在多态的场景下,私有方法不参与多态机制,...
相关推荐
原生类加载器主要负责加载Java API类,而自定义类加载器则可以根据应用程序的需求加载特定的类,例如从网络、数据库或其他非标准位置加载。 `Class`对象提供了多种方法来获取类型信息,如`forName()`用于根据类名...
在JVM生命周期方面,从启动一个Java程序到程序运行过程中,JVM实例与独立运行的Java程序相对应,具有进程级别的生命周期。 面向对象的知识点涉及UML表示法和设计模式。UML表示法小结中包括类图、顺序图、活动图和...
RTTI在Java中主要通过两种形式存在:一种是传统的类型转换,也就是instanceof关键字和类的cast方法;另一种是反射机制。RTTI的实现依赖于Java类模型中的Class类,它是所有类的最终父类,每个类在运行时都会有一个...
- **类加载过程**:当Java类被加载到JVM时,类加载器负责构建该类的方法表。 - **动态绑定**:Java中的方法调用分为静态绑定(如静态方法调用)和动态绑定(如实例方法调用)。动态绑定是指在运行时根据对象的实际...
每个类都有一个Class对象,类加载器(ClassLoader)在类首次被加载到JVM时创建这个对象。通过Class对象,可以获取关于类的详细信息,比如构造函数、成员变量、方法等。 在Java中,Class类实现了Serializable、...
每个 Java 类运⾏时都在 JVM ⾥表现为⼀个 Class 对象,可以通过类名.class、类型.getClass()、Class.forName("类名") 等方法获取 Class 对象。 二、Class 类 Class 类是 Java 反射机制的核心。它提供了多种方法来...
- 每个类加载到JVM时,JVM会为该类创建一个`Class`对象。 - 对于所有实例化的对象,它们共享同一个`Class`对象。 - `Class`对象提供了一种访问类内部结构的方式,包括方法、字段、构造器等。 2. **Class对象的...
1. JAVA 使用 Class 对象来执行 RTTI(RunTime Type Information),创建这个类的实例。 2. 验证同一个类的多个对象的Class对象是一个。 获取 Class 对象有多种方式: 1. 通过 Class 的 forName(String name) 方法...
连接池预先创建了一组数据库连接,当应用程序请求数据库访问时,直接从池中获取一个已建立的连接,使用完毕后归还到池中,避免了每次访问数据库都要新建和销毁连接的开销。JDBC驱动是Java应用程序与数据库通信的桥梁...
3. **注解(Annotation)**:注解是Java提供的一种元数据,提供了在编译时或运行时向编译器和JVM传递信息的方式。例如,`@Override`注解表示方法是重写父类方法,`@Deprecated`表示方法或类已过时。学习注解可以参考...
对于那些从C++转向Java的开发者来说,了解这两种语言之间的差异至关重要。本文将深入探讨C++与Java的主要区别,并特别关注多态性的不同实现方式。 #### 1. 指针支持 - **C++**: 支持指针操作,这为开发者提供了...
当类被首次使用(例如,通过创建实例或访问静态成员)时,JVM的类加载器会加载对应的Class对象。 Class对象可以通过多种方式获取: 1. 使用`Class.forName(String className)`方法,传入类的全限定名,例如`Class....
运行时类型识别(RTTI)通过`instanceof`关键字和`getClass()`方法提供了一种检查对象实际类型的方式,从而安全地执行向下类型转换。 #### 八、多态的陷阱:置换私有方法 在多态的场景下,私有方法不参与多态机制,...