当前位置:首页 » 编程语言 » fornamejava

fornamejava

发布时间: 2022-06-09 14:48:13

java 中的class.forName()是什么意思

Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。

Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和Class.forName(String className)。第一种形式的参数name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。第二种形式则相当于设置了参数initialize的值为true,loader的值为当前类的类加载器。

如下图所示,java类型的属性名称叫name,可以通过forName的方法获取到这个类的实例,从而获取到类里面的属性。

(1)fornamejava扩展阅读:

注意:

在指定类给 class.forName() 方法后,如果找不到指定的类,会抛出ClassNotFoundException异常。Class 的静态 forName() 方法有两个版本,上面的代码是只指定类名称的版本,而另一个版本可以让你指定类名称、加载时是否运行静态区块、指定类加载器:

Static Class forName(String name, boolean initialize, ClassLoader loader)

默认在加载类的时候,如果类中有定义静态区块则会运行它。你可以使用 class.forName() 的第二个版本,将initialize设定为 false,这样在加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块。为了印证,可以先设计一个测试类:

package cn.sunzn.demo;public class TestClass { static {
System.out.println("[运行静态区块]");
}

}

② java中class.forname是什么类

Class是一个类,表示对所有java类进行的一个抽象。可以看jdk说明如下:

forName(String classname)是它的一个静态方法,可以通过className返回一个类对象。比如数据库连接中常用这句代码:

Class driver=Class.forName("jdbc.mysql.jdbc.driver");

参数是驱动类的名字,这句代码表示通过jdbc包返回一个驱动类对象!

③ 请问java下Class.forName的作用是什么,为什么要使用它

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。

关于补充的问题
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。
你可以编个小程序看看就知道了。。。

④ java下Class.forName的作用是什么,为什么要使用它

官方文档

返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:

Class.forName(className, true, currentLoader)

其中 currentLoader 表示此类的定义类加载器。

例如,以下代码片段返回 java.lang.Thread 类的运行时 Class 描述符。

Class t = Class.forName("java.lang.Thread")

调用 forName("X") 将导致名为 X 的类被初始化。

参数:

className - 所需类的完全限定名。

返回:

具有指定名的类的 Class 对象。

通俗的说就是:获得字符串参数中指定的类,并初始化该类

类装载

类装载就是把一个类或是一个接口的字节码文件,通过解析该字节码来构建代表这个类或是这个接口的实例的过程。 这个字节码文件来源可能是压缩包、网络、运行时编译出的或者自动生成的class文件,jvm spec没有规定必须从什么地方加载。

类装载的两种方式:

1.Class c1 = Class.forName ("java.lang.String");

2.ClassLoader cl = new ClassLoader();

Class cl.loadClass( String name, boolean resolve );

两种装载方法的区别:

不同的类装载器

Class.forName是从指定的classloader中装载类,如果没有指定,也就是一个参数的时候,是从装载当前对象实例所在的classloader中装载类。

而ClassLoader的实例调用loadclass方法,是指从当前ClassLoader实例中调用类,而这个实例与装载当前所在类实例的Classloader也许不是同一个.

说白了就是他们实现装载的时候,使用的类装载器的指定是不同的。那为什么使用不同的ClassLoader来装载类呢?

其实使用多个classloader加载类的情况非常常见,比如说我们的app server都是这样的. 在Web与EJB间, 他们的classLoader就是不同的,这样做的目的就是为了避免两者间类装载的相互干扰。

是否实例化类

Class的装载分了三个阶段,loading(装载),linking(连接)和initializing(实例化)分别定义在The Java Language Specification的12.2,12.3和12.4。

Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。注意第二个参数,是指Class被loading后是不是必须被初始化。

ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。

区别就出来了。Class.forName(className)装载的class已经被实例化,而ClassLoader.loadClass(className)装载的class还没有被link,所以就更谈不上实例化了。

简单说,就是通过类名反射出类的对象 。

一般情况下,这两个方法效果一样,都能装载Class。但如果程序需要Class被实例化,就必须用Class.forName(name)了。

例如,在JDBC中加载mysql的驱动类时(关于注册jdbc驱动请参看另外一篇文章,jdbc注册驱动的三种方式),Class.forName("com.mysql.jdbc.Driver"),如果换成getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行,因为它只是向jvm装载了Driver并没有实例化,就不能执行响应的操作。

打开com.mysql.jdbc.Driver的源代码看看,

//

// Register ourselves with the DriverManager

//

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

可以看到,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。

⑤ Java中的getName,class 和forName的区别

没有getName,只有实例化对象.getClass().getName(); 获取class名称。例如:

		Stringname="";
name.getClass().getName();

Class.forName();是为了获取class的字节码,是映射。例如:

		Classclazz=Class.forName("java.lang.String");
StringnewInstance=(String)clazz.newInstance();

⑥ 求class.forname的用法。。(java)

public static Class<?> forName(String className)
throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示当前类的定义类加载器。
例如,以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符。

Class t = Class.forName("java.lang.Thread")
调用 forName("X") 将导致命名为 X 的类被初始化。

参数:
className - 所需类的完全限定名。
返回:
具有指定名的类的 Class 对象。
抛出:
LinkageError - 如果链接失败
ExceptionInInitializerError - 如果此方法所激发的初始化失败
ClassNotFoundException - 如果无法定位该类
以上是jdk文档的说明

返回的是--- 带有给定字符串名的类或接口相关联的 Class 对象---
相关联的Class对象。。即这个Class对象里包含了这个类活接口的信息。。比如方法,属性等。。

可以用来加载类。。因为---调用此方法等效于:
Class.forName(className, true, currentLoader)
其中 currentLoader 表示当前类的定义类加载器。 ----
即调用这个方法的话currentLoader这个类加载器就会加载这个类。。

用得最多的就是反射了。。即你只需要告诉我类名我就能调用你的方法。。设置你的属性。。
所以我可以在你的类还没写的时候就调用你的类的方法--很抽象吧。。
因为我将类名设成我方法的参数或者是你的类的对应的Class对象设为参数。。
这样我可以通过它获得方法。。然后调用。。你用我写的东西的时候把类名或者是对应的Class对象传给我就是了。。

⑦ JAVA 中的forName怎么用

它是class类里面的一个方法,通过class.forName(String),可以通过String值来得到这个对象,这就是简单的反射。用的地方很多啊,在java类中来得到数据库的连接的时候,就可以用class.forName((数据库的驱动器))来得到数据库的连接。

⑧ Java:Class.forName()会将一个类加载入到虚拟机吗

//会加载类的。
//下面有一个举例说明。
public class Exam
{
public static void main(String[] args) throws Exception
{
// 会输出:
// 静态初始化块
// 调用函数设置静态变量N的值为:100
// 所以,Class.forName("C");加载了类C。
Class.forName("C");
}
}

class C
{
static
{
System.out.println("静态初始化块");
}
static int getN()
{
int t=100;
System.out.println("调用函数设置静态变量N的值为:"+t);
return t;
}
static int N=C.getN();
}

⑨ java中的class.forname如何理解

Class classObj = Class.forName("类名");
..尝试根据类地址(类名)获取一个类的类型(Class)对象(这么说好纠结...)....
Class对象可以获取这个class中的方法以及属性,也可以用它来创建此类的对象(反射机制)

你可能是在写连接数据库时加载数据库驱动的时候(对...你也可以这么理解..)遇上这段代码...
..当加载驱动类的时候.会相应的执行该驱动类中 static{}代码块.从而达到不可告人的秘密..(我不知道..但是偶理解是在static代码块里修改了其他JDBC类中的静态属性,如连接方式啥地..,这样在DriverManager获取连接时 获取方式就是驱动类所指定的...当然 你也可以不使用jdbc接口,可以直接调用驱动类去获取连接..不推荐)

⑩ JAVA反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀

forName()是java.lang.Class类的一个方法, 如下
static Class forName(String className) :

返回与带有给定字符串名的类或接口相关联的 Class 对象 。
这句话说的太绕口了,举个例子吧:

Class t = Class.forName("java.lang.Thread")
执行完这句话,Thread类将被虚拟机加载了
类加载以后就可以创建实例,调用属性和方法喽。

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:629
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:357
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:76
php微信接口教程 发布:2025-04-16 17:07:30 浏览:300
android实现阴影 发布:2025-04-16 16:50:08 浏览:788
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:338
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:204
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:801
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:357
土压缩的本质 发布:2025-04-16 16:13:21 浏览:583