获取类对象有3种方式
1. Class.forName
2. Hero.class
3. new Hero().getClass()
在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。因为还没有引入ClassLoader概念, 所以暂时不展开了。
1. Class.forName
2. Hero.class
3. new Hero().getClass()
在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。因为还没有引入ClassLoader概念, 所以暂时不展开了。
代码比较复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
reflection;
import
charactor.Hero;
public
class
TestReflection {
public
static
void
main(String[] args) {
String className =
"charactor.Hero"
;
try
{
Class pClass1=Class.forName(className);
Class pClass2=Hero.
class
;
Class pClass3=
new
Hero().getClass();
System.out.println(pClass1==pClass2);
System.out.println(pClass1==pClass3);
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)
反射有什么用:
创建一个spring.txt文件
class
=reflection.Service1
method=doService1
java文件
package
reflection;
import
java.io.File;
import
java.io.FileInputStream;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Method;
import
java.util.Properties;
public
class
Test {
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
public
static
void
main(String[] args)
throws
Exception {
//从spring.txt中获取类名称和方法名称
File springConfigFile =
new
File(
"e:\\project\\j2se\\src\\spring.txt"
);
Properties springConfig=
new
Properties();
springConfig.load(
new
FileInputStream(springConfigFile));
String className = (String) springConfig.get(
"class"
);
String methodName = (String) springConfig.get(
"method"
);
//根据类名称获取类对象
Class clazz = Class.forName(className);
//根据方法名称,获取方法对象
Method m = clazz.getMethod(methodName);
//获取构造器
Constructor c = clazz.getConstructor();
//根据构造器,实例化出对象
Object service = c.newInstance();
//调用对象的指定方法
m.invoke(service);
}
}