A. java反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀
用Class.forName方法动态加载构造方法带参数的类。
B. java 中的class.forName()是什么意思
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。
C. java下Class.forName的作用是什么,为什么要使用它
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new不一样,要分清楚)。
Aa=(A)Class.forName("pacage.A").newInstance();这和你Aa=newA();
是一样的效果。
关于补充的问题
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。
Class.forName(xxx.xx.xx)返回的是一个类
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
动态加载和创建Class对象,比如想根据用户输入的字符串来创建对象
Stringstr=用户输入的字符串
Classt=Class.forName(str);
t.newInstance();
classc=Class.forName(Example);
factory=(ExampleInterface)c.newInstance();
其中ExampleInterface是Example的接口,可以写成如下形式:
StringclassName="Example";
classc=Class.forName(className);
factory=(ExampleInterface)c.newInstance();
进一步可以写成如下形式:
StringclassName=readfromXMlConfig;//从xml配置文件中获得字符串
classc=Class.forName(className);
factory=(ExampleInterface)c.newInstance();
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载javaAPI的那个加载器。
现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance:弱类型。低效率。只能调用无参构造。
new:强类型。相对高效。
D. JAVA反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀
要调用带参数的方法方法举个例子:package com;
import java.lang.reflect.Method;
public class InvokeMethod {
public static void main(String args[]){
try
{
//动态加载Student类
Class student = Class.forName("com.Student");
//获取Student类名称为printInfo的方法
Method method1 = student.getMethod("printInfo");
//调用printInfo方法
method1.invoke(student.newInstance());
//获取Student类名称为printInfo的方法,String.class是方法的参数类型
Method method2 = student.getMethod("printAddress",String.class);
//调用printAddress方法,其中HK是为方法传递一个参数值
method2.invoke(student.newInstance(),"hello关知红");
}catch(Exception e)
{
e.printStackTrace();
}
}
}