通過反射查看類的信息
Java程序中許多對象在運行時都會出現(xiàn)兩種類型:編譯時類型和運行時類型
例如:Person p = new Student();
編譯類型為:Person
運行類型為:Student
為了解決這種問題滞伟,有兩種方式:
- 假設(shè)在編譯時和運行時都完全知道類型的具體信息,在這種情況下炕贵,可以先使用instanceof 運算符進行判斷
- 編譯時無法知道對象和類屬于那些類梆奈,程序只能依靠運行時信息來發(fā)現(xiàn)該對象和類的真實信息,這就必須通過反射
1. 獲得 Class 對象
java程序中獲得 Class 對象有三種方式
- 使用Class 類的forName(String clazzName)靜方法称开。必須是完整包名亩钟。
- 調(diào)用某個類的class屬性來獲取該類的 Class 對象。
- 調(diào)用某個對象的getClass() 方法鳖轰。
2. 從 Class 對象中獲取信息
具體使用查閱API文檔清酥,下面以一個例子來說明
package com.example;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* Created by zhoujian on 2017/4/5.
*/
public class ClassTest {
private ClassTest() {
System.out.println("執(zhí)行無參構(gòu)造函數(shù)");
}
public ClassTest(String name) {
System.out.println("執(zhí)行有參構(gòu)造函數(shù)");
}
public void method() {
System.out.println("執(zhí)行無參method方法");
}
public void method(String str) {
System.out.println("執(zhí)行有參method方法");
}
public static void main(String[] args) {
//獲取Class對象
Class<ClassTest> aClass = ClassTest.class;
//獲取Class對象所對應(yīng)類的全部構(gòu)造器
Constructor<?>[] constructors = aClass.getDeclaredConstructors();
System.out.println("ClassTest的全部構(gòu)造器如下:");
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//獲取Class對象所對應(yīng)類的全部public構(gòu)造器
Constructor<?>[] cons = aClass.getConstructors();
System.out.println("-----------------------------------");
System.out.println("ClassTest的全部public構(gòu)造器如下:");
for (Constructor<?> c : cons) {
System.out.println(c);
}
//獲取Class對象所對應(yīng)類的全部public方法
Method[] methods = aClass.getMethods();
System.out.println("-----------------------------------");
System.out.println("ClassTest的全部public方法如下:");
for (Method method : methods) {
System.out.println(method);
}
//獲取Class對象所對應(yīng)類的指定方法
try
{
Method meth = aClass.getMethod("method", String.class);
System.out.println("-----------------------------------");
System.out.println("ClassTest里帶一個字符串參數(shù)的method方法:"+meth);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
運行結(jié)果如下:
Snip20170405_1.png
3. Java8 新增的方法參數(shù)反射
package com.example;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;
/**
* Created by zhoujian on 2017/4/3.
*/
public class TextA
{
public void rep(String string, List<String> list)
{
}
public static void main(String[] args) {
Class<TextA> aClass = TextA.class;
try {
//獲取帶有兩個參數(shù)的 rep方法
Method rep = aClass.getMethod("rep", String.class, List.class);
//獲取指定方法參數(shù)個數(shù)
int count = rep.getParameterCount();
System.out.println("rep方法參數(shù)個數(shù):" + count);
//獲取rep 方法的所有參數(shù)信息
Parameter[] parameters = rep.getParameters();
int index = 1;
for (Parameter parameter : parameters) {
//方法返回該類的class文件中是否包含了方法的形參名信息
System.out.println("----第" + index++ + "個參數(shù)信息---");
System.out.println("參數(shù)名:" + parameter.getName());
System.out.println("形參類型:" + parameter.getType());
System.out.println("泛型類型:" + parameter.getParameterizedType());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
Snip20170405_3.png