獲取Class對象有三種方式:
1.通過Object類的getClass()方法。例如:
Class c1 = new String("").getClass();
2.通過Class類的靜態方法——forName()來實現:
Class c2 = Class.forName("MyObject");
3.如果T是一個已定義的類型的話,在java中,它的.class文件名:T.class就代表了與其匹配的Class對象,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;
Class類中存在以下幾個重要的方法:
1.getName()
一個Class對象描述了一個特定類的特定屬性,而這個方法就是返回String形式的該類的簡要描述。由於歷史原因,對數組的Class對象
調用該方法會產生奇怪的結果。
2.newInstance()
該方法可以根據某個Class對象產生其對應類的實例。需要強調的是,它調用的是此類的默認構造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
3.getClassLoader()
返回該Class對象對應的類的類加載器。
4.getComponentType()
該方法針對數組對象的Class對象,可以得到該數組的組成元素所對應對象的Class對象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而這裏得到的class2對象所對應的就應該是int這個基本類型的Class對象。
5.getSuperClass()
返回某子類所對應的直接父類所對應的Class對象。
6.isArray()
判定此Class對象所對應的是否是一個數組對象。
反射是松耦合,靈活性高,動態加載的;引用是緊耦合
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
java.lang.reflect.Modifier;
public
class
ReflectionTest {
public
static
void
main(String[] args) {
Class c=
null
;
try
{
c=Class.forName(
"java.lang.String"
);
System.out.println(
"package "
+c.getPackage().getName()+
";"
);
System.out.print(Modifier.toString(c.getModifiers())+
" "
);
System.out.print(
"class "
+c.getSimpleName()+
" "
);
if
(c.getSuperclass()!=Object.
class
) {
System.out.print(
"extends "
+ c.getSuperclass().getSimpleName());
}
Class[] inters=c.getInterfaces();
if
(inters.length>
0
){
System.out.print(
"implements "
);
for
(
int
i=
0
;i<inters.length;i++){
System.out.print(inters[i].getSimpleName());
if
(i<inters.length-
1
){
System.out.print(
","
);
}
}
}
System.out.println(
"{"
);
printFields(c);
printMethods(c);
System.out.println(
"}"
);
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public
static
void
printFields(Class c){
Field[] field=c.getDeclaredFields();
if
(field.length>
0
){
for
(
int
i=
0
;i<field.length;i++){
System.out.println(Modifier.toString(field[i].getModifiers())+
" "
+field[i].getType().getSimpleName()+
" "
+field[i].getName()+
";"
);
}
}
}
public
static
void
printMethods(Class c){
Method[] method=c.getDeclaredMethods();
if
(method.length>
0
){
for
(
int
i=
0
;i<method.length;i++){
Class[] parameter=method[i].getParameterTypes();
System.out.print(Modifier.toString(method[i].getModifiers())+
" "
+method[i].getReturnType().getSimpleName()+
" "
+method[i].getName()+
"("
);
for
(
int
j=
0
;j<parameter.length;j++){
System.out.print(parameter[j].getSimpleName()+
" args"
);
if
(j!=parameter.length-
1
){
System.out.print(
","
);
}
}
System.out.print(
") "
);
Class exception[]=method[i].getExceptionTypes();
if
(exception.length>
0
) {
System.out.print(
"throws "
);
for
(
int
j =
0
; j < exception.length; j++) {
System.out.print(exception[j].getSimpleName());
}
}
System.out.println(
"{"
);
System.out.println(
"\t... ..."
);
System.out.println(
"}"
);
}
}
}
}
// 反射動態執行方法
public
class
ReflectTest {
public
int
Add(
int
x,
int
y){
System.out.println(x + y);
return
x + y;
}
public
String echo(String str) {
System.out.println(
"Hello, "
+ str);
return
"Hello, "
+ str;
}
public
static
void
main(String[] args)
throws
NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> classType = ReflectTest.
class
;
Object obj = classType.newInstance();
Method method = classType.getMethod(
"Add"
,
new
Class[]{
int
.
class
,
int
.
class
});
method.invoke(obj,
new
Object[] {
new
Integer(
100
),
new
Integer(
200
)} );
Method method2 = classType.getMethod(
"echo"
,
new
Class[] {String.
class
});
method2.invoke(obj,
new
Object[] {
"world"
});
}
}