1.面试官问:Java中Class.forName和ClassLoader到底有啥区别?
2.Class.forName
3.Class.forName 发生了什么
4.jsp登陆界面源代码
面试官问:Java中Class.forName和ClassLoader到底有啥区别?
面试官提问:在Java中Class.forName()与ClassLoader在加载类时有何不同?本文将详细解析。
Class.forName()与ClassLoader均能加载类至Java虚拟机中,其工作原理遵循双亲委派模型,最终调用启动类加载器实现“通过类的全限定名获取描述此类的二进制字节流”的功能。
Class.forName()调用实际亦通过ClassLoader完成,方法原型为Class.forName(String className);在源码中,地方汽车网站源码对参数initialize的默认设置为true,这意示着加载类后将执行类中的静态代码块与静态变量赋值等初始化操作。
此外,Class.forName(String name, boolean initialize, ClassLoader loader)方法允许手动选择在加载类时是否进行初始化。
以含有静态代码块、静态变量、赋值给静态变量的静态方法的类为例,使用Class.forName()与ClassLoader加载类的结果存在显著差异。Class.forName加载类时执行了类的初始化,而ClassLoader的loadClass操作仅加载类至虚拟机中,并未执行初始化。
具体应用场景包括Spring框架中的IOC实现与JDBC中加载数据库连接驱动。在Spring框架中,使用ClassLoader加载类以实现依赖注入,而JDBC规范要求Driver类向DriverManager注册,修正指标公式源码此过程通常在类加载时执行。
以MySQL驱动为例,其注册操作写在静态代码块中,解释了为何在编写JDBC代码时使用Class.forName()的原因。
总结:面试中常遇到有关Java类加载机制的问题,本文通过解析Class.forName()与ClassLoader的区别,为理解类加载机制提供了清晰视角。在实际开发中,理解并恰当使用类加载机制有助于构建高效、灵活的收购知识付费源码系统。
Class.forName
ä¸è¾¹æ¯mysql-connector-java-5.1.6-bin.jarçDriveræºä»£ç ï¼
----com.mysql.jdbc.Driver----------------------------------------------------
.package com.mysql.jdbc;
.import java.sql.SQLException;
.public class Driver extends NonRegisteringDriver implements java.sql.Driver {
. // ~ Static fields/initializers
. // ---------------------------------------------
. //
. // Register ourselves with the DriverManager
.//
. static {
. try {
. java.sql.DriverManager.registerDriver(new Driver());
. } catch (SQLException E) {
. throw new RuntimeException("Can't register driver!");
. }
. }
. public Driver() throws SQLException {
. // Required for Class.forName().newInstance()
. }
.}
------------------------------------------------------------------------
å ¶å®ï¼å¨Class.forName()çæ¶åç³»ç»ä¼æ§è¡å¨æå 载类çstaticåï¼ä¹å°±æ¯-è¡ï¼å ¶ä¸ç代ç æ¯åDriverManager注åMySQLçDriverï¼ç°å¨å¤§å®¶ç¥é为ä»ä¹è¦æ§è¡Class.forName()äºåï¼ï¼ï¼
ä¹å°±æConnection conn = DriverManager.getConnection("è¿æ¥å符串");äºã
Class.forName 发生了什么
在 Java 程序中,获取 Class 有多种方法,包括通过对象的 getClass() 方法、通过类名的直接引用以及通过 Class.forName() 方法。这三种方法各有其应用场景,尤其是 Class.forName() 方法在早期的 JDBC 连接数据库中经常被使用,但许多人对其与前两种方法的区别以及为何只能通过 Class.forName() 方法加载驱动产生疑惑。
为了深入理解 Class.forName() 方法与其他方法的区别,可以编写一段源代码进行验证。例如,spinalhdl源码阅读指南可以创建一个 Test.java 文件,其中包含一个 main 方法,然后运行这段代码,观察 Class.forName() 方法是如何工作的。
通过运行这段代码,我们可以发现 Class.forName() 方法的运行结果与预期相符。这不仅证实了 Class.forName() 方法的功能,而且也展示了如何通过命令行执行类文件。
在深入分析 Class.forName() 方法的源代码时,我们发现它最终调用了一个名为 forName0 的捐赠本站源码 native 方法。这一 native 方法位于 JDK 源代码的 jdk/src/java.base/share/native/libjava/Class.c 文件中。在这个方法中,从指定的 classloader 中查找指定的类。
在 Class.c 文件中,使用了 JVM_FindClassFromCaller 函数从 classloader 中查找类。此时类名按照特定格式(如 com/huangxunyi/Son)进行处理,以确保正确加载类。这一过程涉及多个步骤,包括查找类是否存在、获取对象锁、添加类名到 placeholder、确认类未加载、以及在加载类之前进行一系列验证。
整个加载过程由 src/hotspot/share/classfile/systemDictionary.cpp 文件中的 resolve_instance_class_or_null 函数执行。这个函数负责完成查找类、验证权限、添加类名到 placeholder、确认类未被加载、确保加载过程无误,以及最终加载类并清理 placeholder 的任务。
加载类的具体实现主要在 load_instance_class 方法中,根据 classloader 是否为 null 来决定是通过字节流加载还是通过调用虚拟方法加载类。这个过程最终会调用到 classloader 的 loadClass 方法,实现类的加载。
在整个类加载过程中,Class.forName() 方法通过一系列复杂的步骤确保了类的正确加载和初始化。与 getClass() 方法相比,Class.forName() 方法会自动初始化类,而 getClass() 方法则可以用于获取已初始化的对象。在早期的 JDBC 使用中,Class.forName() 方法被广泛使用,因为它可以自动加载和初始化驱动,确保了程序的正确运行。
然而,随着 Java 技术的发展,ServiceLoader 和 SPI(Service Provider Interface)逐渐取代了传统的 Class.forName() 方法。ServiceLoader 提供了一种更为灵活和模块化的方式来加载和使用服务提供者,使得应用程序能够更容易地适应不同的环境和配置。
jsp登陆界面源代码
1、login.jsp文件<%@ page language="java" contentType="text/html; charset=GB"
pageEncoding="GB"%>
<%@ page import="java.util.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. Transitional//EN">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form name="loginForm" method="post" action="judgeUser.jsp">
<table>
<tr>
<td>用户名:<input type="text" name="userName" id="userName"></td>
</tr>
<tr>
<td>密码:<input type="password" name="password" id="password"></td>
</tr>
<tr>
<td><input type="submit" value="登录" style="background-color:pink"> <input
type="reset" value="重置" style="background-color:red"></td>
</tr>
</table>
</form>
</body>
</html>
2、judge.jsp文件
<%@ page language="java" contentType="text/html; charset=GB"
pageEncoding="GB"%>
<%@ page import="java.util.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. Transitional//EN">
<html>
<head>
<title>身份验证</title>
</head>
<body>
<%
request.setCharacterEncoding("GB");
String name = request.getParameter("userName");
String password = request.getParameter("password");
if(name.equals("abc")&& password.equals("")) {
3、afterLogin.jsp文件
%>
<jsp:forward page="afterLogin.jsp">
<jsp:param name="userName" value="<%=name%>"/>
</jsp:forward>
<%
}
else {
%>
<jsp:forward page="login.jsp"/>
<%
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=GB"
pageEncoding="GB"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. Transitional//EN">
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%
request.setCharacterEncoding("GB");
String name = request.getParameter("userName");
out.println("欢迎你:" + name);
%>
</body>
</html>
扩展资料:
java web登录界面源代码:1、Data_uil.java文件
import java.sql.*;
public class Data_uil
{
public Connection getConnection()
{
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
String user="***";
String password="***";
String url="jdbc:sqlserver://.0.0.1:;DatabaseName=***";
Connection con=null;
try{
con=DriverManager.getConnection(url,user,password);
}catch(SQLException e)
{
e.printStackTrace();
}
return con;
}
public String selectPassword(String username)
{
Connection connection=getConnection();
String sql="select *from login where username=?";
PreparedStatement preparedStatement=null;
ResultSet result=null;
String password=null;
try{
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1,username);
result=preparedStatement.executeQuery();//可执行的 查询
if(result.next())
password=result.getString("password");
}catch(SQLException e){
e.printStackTrace();
}finally
{
close(preparedStatement);
close(result);
close(connection);
}
System.out.println("找到的数据库密码为:"+password);
return password;
}
public void close (Connection con)
{
try{
if(con!=null)
{
con.close();
}
}catch(SQLException e)
{
e.printStackTrace();
}
}
public void close (PreparedStatement preparedStatement)
{
try{
if(preparedStatement!=null)
{
preparedStatement.close();
}
}catch(SQLException e)
{
e.printStackTrace();
}
}
public void close(ResultSet resultSet)
{
try{
if(resultSet!=null)
{
resultSet.close();
}
}catch(SQLException e)
{
e.printStackTrace();
}
}
}
2、login_check.jsp:文件
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4. Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>验证用户密码</title>
</head>
<body>
<jsp:useBean id="util" class="util.Data_uil" scope="page" />
<%
String username=(String)request.getParameter("username");
String password=(String)request.getParameter("password");
if(username==null||"".equals(username))
{
out.print("<script language='javaScript'> alert('用户名不能为空');</script>");
response.setHeader("refresh", "0;url=user_login.jsp");
}
else
{
System.out.println("输入的用户名:"+username);
String passwordInDataBase=util.selectPassword(username);
System.out.println("密码:"+passwordInDataBase);
if(passwordInDataBase==null||"".equals(passwordInDataBase))
{
out.print("<script language='javaScript'> alert('用户名不存在');</script>");
response.setHeader("refresh", "0;url=user_login.jsp");
}
else if(passwordInDataBase.equals(password))
{
out.print("<script language='javaScript'> alert('登录成功');</script>");
response.setHeader("refresh", "0;url=loginSucces.jsp");
}
else
{
out.print("<script language='javaScript'> alert('密码错误');</script>");
response.setHeader("refresh", "0;url=user_login.jsp");
}
}
%>
</body>
</html>
3、loginSucces.jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4. Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO--1">
<title>Insert title here</title>
</head>
<body>
<hr size="" width="%" align="left" color="green">
<font size="6" color="red" >登录成功 </font>
<hr size="" width="%" align="left" color="green">
</body>
</html>
4、user_login.jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4. Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO--1">
<title>登录界面</title>
</head>
<body background="C:\Users\win8\workspace\Login\image\9dcbdceab5cfbc_.jpg" >
<center>
<br><br><br><br><br><br>
<h1 style="color:yellow">Login</h1>
<br>
<form name="loginForm" action="login_check.jsp" method="post">
<table Border="0" >
<tr >
<td>账号</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password">
</td>
</tr>
</table>
<br>
<input type="submit" value="登录" style="color:#BC8F8F">
</form>
</center>
</body>
</html>