suchen
HeimDatenbankMySQL-Tutorial初探Java类加载机制_MySQL

初探Java类加载机制_MySQL

Jun 01, 2016 pm 02:06 PM
classloaderstring文件方法机制

  一、在jdk1.2以后,类加载是通过委托来完成的,这意味着如果 ClassLoader 不能找到类,它会请求父代 ClassLoader 来执行此项任务,所有 ClassLoaders 的根是系统 ClassLoader,它会以缺省方式装入类 -- 即,从本地文件系统。今天我们就来探讨一下在jvm中这些机制是怎样运行的。让我们假设有一个class字节码文件(比如Hello.class文件),那么在应用程序中,他是如何被加载进来,并形成一个类对象的呢?我们这篇文章的目的就是为了解释这个问题。

  在java.lang包里有个ClassLoader类,ClassLoader 的基本目标是对类的请求提供服务。当 JVM 需要使用类时,它根据名称向 ClassLoader 请求这个类,然后 ClassLoader 试图返回一个表示这个类的 Class 对象。通过覆盖对应于这个过程不同阶段的方法,可以创建定制的 ClassLoader。其中有个loadClass(String name, boolean resolve)方法,该方法为ClassLoader的入口点,在jdk1.2以后,loadClass方法将缺省调用findClass方法,详细内容可以参考API文档,我们编写的ClassLoader主要就是为了覆盖以上两个方法。回到我们刚才的问题,怎样读进字节码文件,并把它构成一个类对象呢?在ClassLoader里有个方法,Class defineClass(String name, byte[] b, int off, int len),答案就在这里了,我们根据把class字节码文件(如Hello.class)读进一个字节数组里,byte[] b,并把它转化为Class对象,而这些数据可以来源于文件,网络等,神奇吧:)

  defineClass管理 JVM 的许多复杂、神秘和倚赖于实现的方面 -- 它把字节码分析成运行时数据结构、校验有效性等等。不必担心,您无需亲自编写它。事实上,即使您想要这么做也不能覆盖它,因为它已被标记成最终的。

  其他一些方法:

  findSystemClass方法:从本地文件系统装入文件。它在本地文件系统中寻找类文件,如果存在,就使用 defineClass 将原始字节转换成 Class 对象,以将该文件转换成类。

  findClass方法:jdk1.2以后loadClass 的缺省实现调用这个新方法。findClass 的用途包含您的 ClassLoader 的所有特殊代码,而无需要复制其它代码(例如,当专门的方法失败时,调用系统 ClassLoader)。

  getSystemClassLoader: 如果覆盖 findClass 或 loadClass,getSystemClassLoader 使您能以实际 ClassLoader 对象来访问系统 ClassLoader(而不是固定的从 findSystemClass 调用它)。

  getParent:为了将类请求委托给父代 ClassLoader,这个新方法允许 ClassLoader 获取它的父代 ClassLoader。当使用特殊方法,定制的 ClassLoader 不能找到类时,可以使用这种方法。

  resolveClass: 可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的 loadClass 时,可以调用 resolveClass,这取决于 loadClass 的 resolve 参数的值。
  findLoadedClass:充当一个缓存,当请求 loadClass 装入类时,它调用该方法来查看 ClassLoader 是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。应首先调用该方法。

  二、工作流程:

  1)调用 findLoadedClass(String) 来查看是否存在已装入的类,如果没有,那么采用那种特殊的神奇方式来获取原始字节。

  2)通过父类ClassLoader调用loadClass方法,如果父类ClassLoader是null,那么按缺省方式装入类,即系统ClassLoader。

  3)调用findClass(String)去查找类并获取类;

  4)如果loadClass 的 resolve 参数的值为true,那么调用 resolveClass 解析 Class 对象.

  5)如果还没有类,返回 ClassNotFoundException。

  6)否则,将类返回给调用程序。

  三、一个实现了ClassLoader的例子:

  /**
  *CompilingClassLoader.java
  *Copyright 2005-2-12
  */
  import java.io.*;

  public class CompilingClassLoader extends ClassLoader{
  //读取一个文件的内容
  private byte[] getBytes(String filename) throws IOException{
  File file=new File(filename);
  long len=file.length();
  byte[] raw=new byte[(int)len];

  FileInputStream fin=new FileInputStream(file);

  int r=fin.read(raw);
  if(r!=len) throw new IOException("Can't read all,"+r+"!="+len);

  fin.close();

  return raw;
  }

  private boolean compile(String javaFile) throws IOException{
  System.out.println("CCL:Compiling "+javaFile+"...");
  //调用系统的javac命令
  Process p=Runtime.getRuntime().exec("javac "+javaFile);
  try{
  //其他线程都等待这个线程完成
  p.waitFor();
  }catch(InterruptedException ie){
  System.out.println(ie);
  }
  int ret=p.exitValue();

  return ret==0;
  }

  public Class loadClass(String name,boolean resovle) throws ClassNotFoundException{
  Class clas=null;

  clas=findLoadedClass(name);

  //这里说明了包的表示
  String fileStub=name.replace('.','/');

  String javaFilename=fileStub+".java";
  String classFilename=fileStub+".class";

  File javaFile=new File(javaFilename);
  File classFile=new File(classFilename);

  //如果存在class文件就不编译
  if(javaFile.exists()&&(!classFile.exists()||javaFile.lastModified()>classFile.lastModified())){
  try{
   if(!compile(javaFilename)||!classFile.exists()){
    throw new ClassNotFoundException("ClassNotFoundExcetpion:"+javaFilename);
   }
  }catch(IOException ie){
   throw new ClassNotFoundException(ie.toString());
  }
  }

  try{
  byte[] raw=getBytes(classFilename);

  //通过读入数据来构造一个类结构,这是核心
  clas=defineClass(name,raw,0,raw.length);
  }catch(IOException ie){
  //
  }

  if(clas==null){
  clas=findSystemClass(name);
  }

  System.out.println("findSystemClass:"+clas);

  if(resovle && clas!=null){
  resolveClass(clas);
  }

  if(clas==null){
  throw new ClassNotFoundException(name);
  }

  return clas;
  }
  }
  测试该loader:
  /**
  *TestRun.java
  *Copyright 2005-2-11
  */
  import java.lang.reflect.*;

  public class TestRun{
  public static void main(String[] args) throws Exception{
  String progClass=args[0];

  String progArgs[]=new String[args.length-1];
  System.arraycopy(args,1,progArgs,0,progArgs.length);

  CompilingClassLoader ccl=new CompilingClassLoader();

  Class clas=ccl.loadClass(progClass);

  //返回一个class的type
  Class[] mainArgType={(new String[0]).getClass()};
  Method main=clas.getMethod("main",mainArgType);

  Object argsArray[]={progArgs};

  main.invoke(null,argsArray);

  }
  }

  以上的核心内容已经编写完了,编译后,我们得到两个文件:

  CompilingClassLoader.class,TestRun.class

  四、编写一个例子,然后运行我们的ClassLoader

  /**
  *Hello.java
  */
  public class Hello{
  public static void main(String[] args){
  if(args.length!=1){
   System.err.println("Error,exit!");
   System.exit(1);
  }
  String name=args[0];
  System.out.println("Hello,"+name);
  }
  }

  好了,运行java TestRun Hello 阿飞

  ....
  ....
  ....
  Hello,阿飞

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie wirkt sich die MySQL -Kardinalität auf die Abfrageleistung aus?Wie wirkt sich die MySQL -Kardinalität auf die Abfrageleistung aus?Apr 14, 2025 am 12:18 AM

Die MySQL -Idium -Kardinalität hat einen signifikanten Einfluss auf die Abfrageleistung: 1. Hoher Kardinalitätsindex kann den Datenbereich effektiver einschränken und die Effizienz der Abfrage verbessern. 2. Niedriger Kardinalitätsindex kann zu einem vollständigen Tischscannen führen und die Abfrageleistung verringern. 3. Im gemeinsamen Index sollten hohe Kardinalitätssequenzen vorne platziert werden, um die Abfrage zu optimieren.

MySQL: Ressourcen und Tutorials für neue BenutzerMySQL: Ressourcen und Tutorials für neue BenutzerApr 14, 2025 am 12:16 AM

Der MySQL -Lernpfad umfasst Grundkenntnisse, Kernkonzepte, Verwendungsbeispiele und Optimierungstechniken. 1) Verstehen Sie grundlegende Konzepte wie Tabellen, Zeilen, Spalten und SQL -Abfragen. 2) Lernen Sie die Definition, die Arbeitsprinzipien und die Vorteile von MySQL kennen. 3) Master grundlegende CRUD -Operationen und fortgeschrittene Nutzung wie Indizes und gespeicherte Verfahren. 4) KON -Debugging- und Leistungsoptimierungsvorschläge, wie z. B. rationale Verwendung von Indizes und Optimierungsabfragen. In diesen Schritten haben Sie einen vollen Verständnis für die Verwendung und Optimierung von MySQL.

Reale MySQL: Beispiele und AnwendungsfälleReale MySQL: Beispiele und AnwendungsfälleApr 14, 2025 am 12:15 AM

Die realen Anwendungen von MySQL umfassen grundlegende Datenbankdesign und komplexe Abfrageoptimierung. 1) Grundnutzung: Wird zum Speichern und Verwalten von Benutzerdaten verwendet, z. B. das Einfügen, Abfragen, Aktualisieren und Löschen von Benutzerinformationen. 2) Fortgeschrittene Nutzung: Verwandte komplexe Geschäftslogik wie Auftrags- und Bestandsverwaltung von E-Commerce-Plattformen. 3) Leistungsoptimierung: Verbesserung der Leistung durch rationale Verwendung von Indizes, Partitionstabellen und Abfrage -Caches.

SQL -Befehle in MySQL: Praktische BeispieleSQL -Befehle in MySQL: Praktische BeispieleApr 14, 2025 am 12:09 AM

SQL -Befehle in MySQL können in Kategorien wie DDL, DML, DQL und DCL unterteilt werden und werden verwendet, um Datenbanken und Tabellen zu erstellen, zu ändern, zu löschen, Daten einfügen, aktualisieren, Daten löschen und komplexe Abfragebetriebe durchführen. 1. Die grundlegende Verwendung umfasst die Erstellungstabelle erstellbar, InsertInto -Daten einfügen und Abfragedaten auswählen. 2. Die erweiterte Verwendung umfasst die Zusammenarbeit mit Tabellenverbindungen, Unterabfragen und GroupBy für die Datenaggregation. 3.. Häufige Fehler wie Syntaxfehler, Datentyp -Nichtübereinstimmung und Berechtigungsprobleme können durch Syntaxprüfung, Datentypkonvertierung und Berechtigungsmanagement debuggen. 4. Vorschläge zur Leistungsoptimierung umfassen die Verwendung von Indizes, die Vermeidung vollständiger Tabellenscanning, Optimierung von Join -Operationen und Verwendung von Transaktionen, um die Datenkonsistenz sicherzustellen.

Wie geht InnoDB mit der Einhaltung der Säure um?Wie geht InnoDB mit der Einhaltung der Säure um?Apr 14, 2025 am 12:03 AM

InnoDB erreicht Atomizität durch Ungewöhnung, Konsistenz und Isolation durch Verriegelungsmechanismus und MVCC sowie Persistenz durch Redolog. 1) Atomizität: Verwenden Sie Unolog, um die Originaldaten aufzuzeichnen, um sicherzustellen, dass die Transaktion zurückgerollt werden kann. 2) Konsistenz: Stellen Sie die Datenkonsistenz durch Verriegelung auf Zeilenebene und MVCC sicher. 3) Isolierung: Unterstützt mehrere Isolationsniveaus und wird standardmäßig WiederholungSead verwendet. 4) Persistenz: Verwenden Sie Redolog, um Modifikationen aufzuzeichnen, um sicherzustellen, dass die Daten für lange Zeit gespeichert werden.

Mysqls Platz: Datenbanken und ProgrammierungMysqls Platz: Datenbanken und ProgrammierungApr 13, 2025 am 12:18 AM

Die Position von MySQL in Datenbanken und Programmierung ist sehr wichtig. Es handelt sich um ein Open -Source -Verwaltungssystem für relationale Datenbankverwaltung, das in verschiedenen Anwendungsszenarien häufig verwendet wird. 1) MySQL bietet effiziente Datenspeicher-, Organisations- und Abruffunktionen und unterstützt Systeme für Web-, Mobil- und Unternehmensebene. 2) Es verwendet eine Client-Server-Architektur, unterstützt mehrere Speichermotoren und Indexoptimierung. 3) Zu den grundlegenden Verwendungen gehören das Erstellen von Tabellen und das Einfügen von Daten, und erweiterte Verwendungen beinhalten Multi-Table-Verknüpfungen und komplexe Abfragen. 4) Häufig gestellte Fragen wie SQL -Syntaxfehler und Leistungsprobleme können durch den Befehl erklären und langsam abfragen. 5) Die Leistungsoptimierungsmethoden umfassen die rationale Verwendung von Indizes, eine optimierte Abfrage und die Verwendung von Caches. Zu den Best Practices gehört die Verwendung von Transaktionen und vorbereiteten Staten

MySQL: Von kleinen Unternehmen bis zu großen UnternehmenMySQL: Von kleinen Unternehmen bis zu großen UnternehmenApr 13, 2025 am 12:17 AM

MySQL ist für kleine und große Unternehmen geeignet. 1) Kleinunternehmen können MySQL für das grundlegende Datenmanagement verwenden, z. B. das Speichern von Kundeninformationen. 2) Große Unternehmen können MySQL verwenden, um massive Daten und komplexe Geschäftslogik zu verarbeiten, um die Abfrageleistung und die Transaktionsverarbeitung zu optimieren.

Was liest Phantom und wie verhindert InnoDB sie (Sperren des nächsten Schlägers)?Was liest Phantom und wie verhindert InnoDB sie (Sperren des nächsten Schlägers)?Apr 13, 2025 am 12:16 AM

InnoDB verhindert effektiv das Phantom-Lesen durch den Mechanismus für den nächsten Kleien. 1) Nächstschlüsselmesser kombiniert Zeilensperr- und Gap-Sperre, um Datensätze und deren Lücken zu sperren, um zu verhindern, dass neue Datensätze eingefügt werden. 2) In praktischen Anwendungen kann durch Optimierung der Abfragen und Anpassung der Isolationsstufen die Verringerungswettbewerb reduziert und die Gleichzeitleistung verbessert werden.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung