天天看點

初學Java反射之簡單明了的反射例子。

在學習程式設計的過程中,我覺得不止要獲得課本的知識,更多的是通過學習技術知識提高解決問題的能力,這樣我們才能走在最前方,更多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);

}