在學習程式設計的過程中,我覺得不止要獲得課本的知識,更多的是通過學習技術知識提高解決問題的能力,這樣我們才能走在最前方,更多Java學習,請浏覽瘋狂java官網。
Java反射在我們Java學習的過程中是非常重要的知識點。可能有些同學認為這個學習起來不容易了解,其實就我個人而言還是比較簡單,學習起來也比較容易了解。下面我給大家總結一下Java反射學習的要點,同時給出幾個比較好的例子。
1、Java反射的概念
反射含義:可以擷取正在運作的Java對象。
2、Java反射的功能
1)可以判斷運作時對象所屬的類
2)可以判斷運作時對象所具有的成員變量和方法
3)通過反射甚至可以調用到private的方法
4)生成動态代理
3、實作Java反射的類
1)Class:它表示正在運作的Java應用程式中的類和接口
2)Field:提供有關類或接口的屬性資訊,以及對它的動态通路權限
3)Constructor:提供關于類的單個構造方法的資訊以及對它的通路權限
4)Method:提供關于類或接口中某個方法資訊
注意:Class類是Java反射中最重要的一個功能類,所有擷取對象的資訊(包括:方法/屬性/構造方法/通路權限)都需要它來實作
@SuppressWarnings("rawtypes")
public static <T> void testReflectBase(Object clazz) throws ClassNotFoundException{
// Class c1 = Object.class;
Class c1 = clazz.getClass();
Class c2 = Class.forName("com.evangelsoft.crosslink.qrcode.test.TestCode");
Class c3 = new TestCode().getClass();
//完整的包名+類名。
printlnDemo("擷取類的包名");
String package01 = c1.getPackage().getName();
String package02 = c2.getPackage().getName();
println("package01",package01 );
println("package02",package02 );
println("");
printlnDemo("擷取類的修飾符");
int mod = c1.getModifiers();
String modifier = Modifier.toString(mod);
println("mod",mod);
println("modifier",modifier);
println("");
printlnDemo("擷取完整限定名(包名+類名)");
String canonical = c1.getCanonicalName();
String className = c1.getName();
println("canonical", canonical);
println("className",className );
println("");
printlnDemo("擷取父類(包+類名)");
Class superClazz = c1.getSuperclass();
String superClazzName = superClazz.getName();
println("superClazzName", superClazzName);
println("");
printlnDemo("擷取實作的接口");
Class[] interfaces = c1.getInterfaces();
for(Class t : interfaces){
println("interfacesName", t.getName());
}
println("");
printlnDemo("擷取類的成員變量");
Field[] fields = c1.getDeclaredFields();
for(Field field : fields){
//擷取每個字段的通路修飾符
modifier = Modifier.toString(field.getModifiers());
println("field.getModifiers()", field.getModifiers());
println("filedModifier", modifier);
//擷取字段資料類型對應的Class對象。
Class fieldClassType = field.getType();
//擷取字段名
String name = field.getName();
println("fieldName", name);
//如果是數組類型則需要特别處理
if(fieldClassType.isArray()){
String arrayType = fieldClassType.getComponentType().getName()+ "[]";
println("fieldType", arrayType);
} else {
println("fieldType", fieldClassType);
}
println("");
}
println("");
printlnDemo("擷取類的構造方法");
Constructor[] constructors = c1.getDeclaredConstructors();
for(Constructor constructor : constructors){
//構造方法名
String name = constructor.getName();
//擷取通路修飾符
modifier = Modifier.toString(constructor.getModifiers());
print(""+modifier +" " + name + "(");
//擷取構造方法中的參數
Class[] paramTypes = constructor.getParameterTypes();
for(int i = 0 ; i < paramTypes.length ; i++){
if(i > 0){
print(",");
}
if(paramTypes[i].isArray()){
print(paramTypes[i].getComponentType().getName()+"[]");
} else {
print(paramTypes[i].getName());
}
}
println(");");
}
println("");
printlnDemo("擷取成員方法");
Method[] methods = c1.getDeclaredMethods();
for(Method method : methods){
modifier = Modifier.toString(method.getModifiers());
//擷取方法的傳回類型
Class returnType = method.getReturnType();
if(returnType.isArray()){
String arrType = returnType.getComponentType().getName() + "[]";
print("" + modifier +" " + arrType + " " + method.getName() + "(");
} else {
print("" + modifier + " " + returnType.getName() + " " + method.getName() + "(");
}
Class[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if(i > 0){
print(",");
}
if(paramTypes[i].isArray()){
print(paramTypes[i].getComponentType().getName() + "[]");
} else {
print(paramTypes[i].getName());
}
}
println(")");
}
println("");
}
@SuppressWarnings("unchecked")
public static <T> void testEasyUse(Object clazz)
throws InstantiationException, IllegalAccessException,
SecurityException, NoSuchFieldException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
//Class c1 = clazz.getClass();
Class c1 = clazz.getClass();
//利用反射來建立類的對象。
TestCode instance = (TestCode) c1.newInstance();
println("userName", instance.userName );
println("password", instance.password );
println("");
Method method = c1.getDeclaredMethod("setUserName", String.class);
method.invoke(instance, "Java反射的學習");
println("username", instance.getUserName());
method = c1.getDeclaredMethod("setPassword", String.class);
method.setAccessible(true);
method.invoke(instance, "反射執行Private修飾的方法");
println("password", instance.password);
println("");
method = c1.getMethod("updataUser", new Class[]{ String.class, String.class});
method.invoke(instance, "反射調用公共修飾符的使用者","反射調用公共修飾符的密碼");
println("userName", instance.userName );
println("password", instance.password );
println("");
method = c1.getDeclaredMethod("updataUser", new Class[]{ String.class, String.class, int.class});
method.invoke(instance, "聲明式的方法反射調用公共修飾符的使用者","聲明式的方法反射調用公共修飾符的密碼",999);
println("userName", instance.getUserName() );
println("password", instance.getUserName() );
println("age", instance.getAge() );
println("");
}
public static void main(String[] args) {
try {
testReflectBase(new String());
testEasyUse(new TestCode());
} catch (Exception e) {
e.printStackTrace();
}
}
public String userName;
private String password;
private int age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
private void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void updataUser(String account, String password){
this.userName = account;
this.password = password;
}
private void updataUser(String account, String password, int age){
this.userName = account;
this.password = password;
this.age = age;
}
private static void println(Object o){
System.out.println(o);
}
private static void print(Object o){
System.out.print(o);
}
private static void printlnDemo(String describe){
println("[" + describe+"]");
}
private static void println(Object printKey, Object printValue) {
println(printKey + " : " + printValue);
}