4 回答
TA贡献2080条经验 获得超4个赞
Class.forName() 是指返回的是一个类。class.forName(),可以通过反射来操作这个类,例如获取属性,获取方法等等。
class.forName是用到了java.lang.Class.forName包的方法,他是通过类的全称来返回一个类,全称是指包名称加类名称,他是通过jvm来加载的,这样就可以获取到这个类了。
Class.forName是用到了java.lang.Class.forName包的方法,全称是指包名称加类名称,是通过jvm来加载的。过jvm就可以获取到这个类,也可以通过反射来操作这个类,例如获取属性,获取方法等等。这种方式在框架中比较常见。
jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行了静态代码,而且以后不会再执行这段静态代码。
扩展资料:
用法示例:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();
其中ExampleInterface是Example的接口,可以写成如下形式:
String className = “Example”;
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。
Class.forName()用法详解:
Class.forName(xxx.xx.xx)返回的是一个类。Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。
当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。
如果想借由“修改Java标准库源码”来观察Class 对象的实际生成时机(例如在Class的constructor内添加一个println()),这样是行不通的!因为Class并没有public constructor。
TA贡献1828条经验 获得超3个赞
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的方法获取到这个类的实例,从而获取到类里面的属性。
扩展资料:
注意:
在指定类给 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("[运行静态区块]");
}
}
TA贡献1874条经验 获得超12个赞
class.forName是用到了java.lang.Class.forName包的方法,他是通过类的全称来返回一个类,全称是指包名称加类名称,他是通过jvm来加载的。这样你就可以获取到这个类了,你可以通过反射来操作这个类,例如获取属性,获取方法等等。这种方式在框架中比较常见。
如下图所示,App类里面有个String类型的属性名称叫name,我们可以通过forName的方法获取到这个类的实例,从而获取到类里面的属性。
扩展资料:
什么时候用Class.forName()?
先来个热身,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?你第一想到的肯定是new,但是注意一点:
A a = (A)Class.forName(“pacage.A”).newInstance();
这和你 A a = new A(); 是一样的效果。
现在言归正传。
动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象时需要用到:
String str = “用户输入的字符串” ;
Class t = Class.forName(str);
t.newInstance();
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?
它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
添加回答
举报