我给你说的简单点,上面看了那么多我眼睛都花了~ ------------------- Class c=Class.forName(str); str是个字符串,这个字符串包括定义类的路径,和定义类的名字例如:oracle.jdbc.driver.OracleDriver 路径:oracle.jdbc.driver 名字:OracleDriver
Class.forName(str)只是对类的加载,既把字节码放入内存,并没有实例化。一般我们在动态创建一个对象的时候用的比较多。如: Test t=(Test)Class.forName("com.Test").newInstance(); System.out.println(Test.class==Class.forName("com.Test"));结果是true
还要注意一点: Test t=(Test)Class.forName("com.Test").newInstance(); 这样做不是安全的,首先你要保证Test要有一个无参数的构造方法,否则会抛异常。 public class Test{ public Test(){}//如果没有其它构造方法,那么这个也可以不写,即系统默认的构造方法 }
Class.forName(str).newInstance() 得到Object 再类型转换
12正解,你还可以用ClassLoader获得一个类,比如java.util.Vector
谢谢,不过,没对上啊楼上的,行不通吧,如果能转型,我又何必用Object呢
感谢你的讲解,可是,Test是传过来的字符String 啊,我不能显示的写出来啊
可是,Test是传过来的字符String 啊,我不能显示的写出来啊LZ什么意思啊,我没明白
public class CreateObj{ public static void main(String[] args){ Test t=(Test)new CreateObe().getInstance("com.zgh.Test"); t.show(); } public Object getInstance(String path){ return Class.forName(path).newInstance(); }} 下面是Test类: package com.zgh; public class Test{ public Test(){}//如果没有其它构造方法,那么这个也可以不写,即系统默认的构造方法 //public Test(String name){System.out.println(name)}//如果有此构造方法的话,那么上面的那个构造方法一定要有,否则就不能用newInstance()方法创建对象了 public void show(){ System.out.println("success"); } }
直接用就是了啊.
Class.forname("oracle.jdbc.driver.OracleDriver");
生成对象的话(转换类型)Class.forName(“。。”)。newIn....() 这个方法
那是传过来的str 啊!!!
Class<objest> refClassName = Class.forName("java.lang.String"); //取到了一个Class对象
String str=(String)refClassName.newInstance();//得到一个实例
str是一个实现接口的类
str是一个实现接口的类,刚写错了
这片文章详细讲述了Class,希望对你有用
Class cls=Class.forName("java.util.Date"); //通过类路径加载类到虚拟机,生成类对象,类加载器为默认加载器。
Constructor constructor= cls.getConstructor(long.class);//获得该类的一个含参数构造函数,要提供参数类模板对象
Method method=cls.getMethod("getTime", null);//获得该类的一个方法对象,此方法有一个long类型的返回值。此方法无参数,所以参数模板传入null
Field field= cls.getDeclaredField("fastTime");//获得该类的一个私有属性对象,该属性为long类型
Object obj=constructor.newInstance(10000000L);//通过构造函数对象构造一个该类的对象,参数为10000000L
Object times=field.get(obj);//获得该类的一个对象此私有属性的值。
Object times2=method.invoke(obj, null);//执行该对象的方法并得到一个返回值。
-------------------
Class c=Class.forName(str);
str是个字符串,这个字符串包括定义类的路径,和定义类的名字例如:oracle.jdbc.driver.OracleDriver
路径:oracle.jdbc.driver
名字:OracleDriver
Test t=(Test)Class.forName("com.Test").newInstance();
System.out.println(Test.class==Class.forName("com.Test"));结果是true
Test t=(Test)Class.forName("com.Test").newInstance();
这样做不是安全的,首先你要保证Test要有一个无参数的构造方法,否则会抛异常。
public class Test{
public Test(){}//如果没有其它构造方法,那么这个也可以不写,即系统默认的构造方法
}
得到Object
再类型转换
public static void main(String[] args){
Test t=(Test)new CreateObe().getInstance("com.zgh.Test");
t.show();
}
public Object getInstance(String path){
return Class.forName(path).newInstance();
}}
下面是Test类:
package com.zgh;
public class Test{
public Test(){}//如果没有其它构造方法,那么这个也可以不写,即系统默认的构造方法
//public Test(String name){System.out.println(name)}//如果有此构造方法的话,那么上面的那个构造方法一定要有,否则就不能用newInstance()方法创建对象了
public void show(){
System.out.println("success");
}
}
一般来说使用 Class.forName 生成对象的方法,是为了更好地进行解耦处理的。一般需要预先定义一个接口(比如叫:MyTest),而具体的实现类则放在配置文件中
(比如配置的是:com.test.MyTestImpl),这样我们只要得到 com.test.MyTestImpl
这个字符串,就可以动态生成类了(假设是无参构造):String impl = "com.test.MyTestImpl"; // impl 是从配置中读取到的字符串
MyTest myTest = (MyTest)Class.forName(impl).netInstance();需要注意的是,我们将其强转为 MyTest 接口,这样我们的应用程序的耦合度就降低了,
这就是面向接口编程。假设,我们现在具体的实现方式更改了(比如:采用更好的技术来实现了),这样的话,
我们可以新建一个 com.test.MyTestImpl2 的实现类(需要注意的是,我们不能在原来的
com.test.MyTestImpl 上更改,只能新建一个),这样只要将配置文件中的配置改为这个
的话,原来写好的 Java 代码就可以一行不改地换掉一个实现类。这样的话,我们写好的这个类的灵活性就很高了,具体的实现并不是写死在代码里面的,是
可以通过配置文件进配置的。上面的这种是 Class#forName Class#newInstance 最大的用途,至于楼主说到的,要强转
为指定的字符串的话,在所有目前已经发布的 JDK 中是做不到的。