用class.forname去class 创建对象一个map的对象报空指针异常

java中的Class.forName的作用
我的图书馆
java中的Class.forName的作用
java中的Class.forName的作用
Class.forName有什么作用
Class.forName(xxx.xx.xx) 返回的是一个类
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。
至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 A a = (A)Class.forName("pacage.A").newInstance(); 这和你 A a = new A(); 是一样的效果。
关于补充的问题 答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。
Class.forName(xxx.xx.xx) 返回的是一个类 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 String str = 用户输入的字符串 Class t = Class.forName(str); t.newInstance();
&在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如: 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 = readfromXMlC//从xml 配置文件中获得字符串 class c = Class.forName(className); factory = (ExampleInterface)c.newInstance();
上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。
现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别: newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。
下面内容转自介绍的是 forName() 和 ClassLoader 的 loadClass 方法。现在终于知道了为什么 forName()是会执行 static 语句,因为默认情况它总是初始化这个被装载的类。关于forName()方法这个方法总是返回要加载的类的Class类的实例1、forName(String className)单参数时, initialize=true&&& a.总是使用当前类装载器(也就是装载执行forName()请求的类& 的类装载器)&&& b.总是初始化这个被装载的类(当然也包括:装载、连接、初始化)2、forName(String className, boolean initialize, ClassLoader loader)&&& a.loader指定装载参数类所用的类装载器,如果null则用bootstrp装载器。&&& b.initialize=true时,肯定连接,而且初始化了;&&& c.false时,绝对不会初始化,但是可能被连接了,但是这里有个例外,如果在调用这个forName()前,已经被初始化了,那么返回的类型也肯定是被初始化的(当然,这里也暗含着:被同一个loader所装载的,而且这个类被初始化了)
关于用户自定义的类装载器的loadClass()方法1、loadClass(String name)单参数时, resolve=false&&& a.如果这个类已经被这个类装载器所装载,那么,返回这个已经被装载的类型的Class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接。绝对不会被初始化&&& b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了2、loadClass(String name, boolean resolve)&&& a.resolve=true时,则保证已经装载,而且已经连接了。resolve=falses时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接
TA的推荐TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢java Map对象数组赋值,空指针问题_百度知道
java Map对象数组赋值,空指针问题
static Map&Float, Integer&[] standard;
standard=new LinkedHashMap[10];
for(int i=0;i&10;i++){
System.out.println(standard[i]);
standard[i].put((float)0.0, 1);
standard[i].put(7231.3f, 1);
我有更好的答案
可是数组里的每个Map还是null啊。static Map&Float, Integer&[] standard;standard=new LinkedHashMap[10]; 需要有这句standard[i], Integer&(); /&#47.println(standard[i]);standard[i] = new LinkedHashMap&for(int i=0;i&10.i++){SFloat.put((float)0.0, 1);standard[i].put(7231你只开了数组
采纳率:57%
out应该是这样吧 standard[i].3f, 1);System.put((float)0.0, 1);standard[i].put(7231
谢谢,不是,与输出语句无关,put那两句有错,空指针异常
为您推荐:
其他类似问题
您可能关注的内容
对象数组的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。JAVA 获取class对象 类名.class Class.forName()两种方法什么情况下使用 为什么?_百度知道
JAVA 获取class对象 类名.class Class.forName()两种方法什么情况下使用 为什么?
类名.class
Class.forName()两种方法各在什么情况下使用的
为什么在这种情况下使用请具体说明一下???
我有更好的答案
class 是获得当前对象的句柄。 class,java虚拟机通过class.forName(class 名) 寻找到 名字为class 的 类文件装载进 虚拟机。
object ob=clsss.forName(&quot.forName()用于反射
直接使用Class对象的局部class,如果要创建新的对象.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应类名,不需要用new类名.forName就可以了
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一直报空指针异常,怎么解决?_百度知道
一直报空指针异常,怎么解决?
原来好好地,重开机就不能用了,不知道怎么回事!
我有更好的答案
数据库没驱动起来,连接都没建立起来,所以报空指针.1 确认导入包 正确2 确认配置文件properties 是否是写正确的3 检查 DBUtil这个类,先测试连接正确,在用doGet
问题不在这个类里面
在你的数据库工具类出问题了
也就是这个方法出问题了DBUti.getConn();你的工具类有问题
出的异常也很简单 ,ClassForName
通过类名无法加载到对象报找不到类的错误 也就是说你的 jdvc驱动包 没有找到Class.forName(&oracle.jdbc.OracleDriver&); 注册JDBC驱动
这样写是错误
的你应该这样写才对:Class.forName(&oracle.jdbc.driver.OracleDriver&); 你把工具类里的这行代码改一下就行了!jdbc驱动包一定要导入到项目中
好了 就这些了
这个是我写的DBUti,按照老师讲课内容写的,没有变过呀,原来private static final String DRIVER = &oracle.jdbc.OracleDriver&;可以,为啥突然不能用了?按你说的改了也不行
你的oracle的驱动貌似错了啊
是么?怎么解决呀?需要重新设定还是重装?
什么啊,我看不懂你问什么啊,好像这个代码不是你写的啊,从你问的话里面我看出来了
是我写的呀,我是问驱动错了需要怎么调试么?还是需要重新安装oracle数据库。我写的用户登录验证,原来好好地,没用动过程序,上午关机,下午重开了突然不能用了,不知道怎么回事。
你的oracle的服务呢,你用软件连接数据库,看看能连么你的驱动包如果没有错,那就是连接的问题了啊
能够连上数据库,应该是工程连接问题,在找问题
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java 代码中预防空指针异常的处理办法
转载 & & 作者:
个人在做项目时,对NullPointerException的几点总结,请网友拍砖!!!多多提意见,
项目中遇到的NullPointerException 分两种情况:
1. 引用空对象,即调用空对象的方法或引用空对象的属性。
2. 将8中基础类型的封装类赋值给对应的基础类。
1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为空,对于Collection Map 我一般会调用CollectionUtils MapUtils ,对于返回的String对象,我会调StringUtils.isNotEmpty()进行非空判断。他们中isNotEmpty不仅判断了NULL 还判断了空集合和空串。例如从数据中查询的结果。工作流中返回的定价URL
2. 对于自己创建的对象,要留心对象进行哪些操作,中间会不会造成对象为空,如果可能加非空判断,尤其是对于集合的操作,很容易就报空指针!!!所以每次对操作集合时,我都会非常的留心。
3. 对于前台的领域对象要非常的留心,因为这些对象是框架创建的,假如我没有在前台的文本框内输入值,虽然提交时后台获得的是空串,但发生NullPointerException的概率很高。
4. 对于String 的操作尽量使用apache 的StringUtils类,与String相比这个是非常的安全。对于集合的操作使用apache的CollectionUtils 、MapUtils, 相比apache工具类的执行效率也非常的高,比如StringUtils.split();
有人说过多的判断会影响性能,我个人认为这里的性能牺牲和系统的安全相比是微不足道的。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 map的class对象 的文章

 

随机推荐