歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java反射機制的基本用法

Java反射機制的基本用法

日期:2017/3/1 10:10:53   编辑:Linux編程

1、獲取一個Class對象

Class c = this.getClass();//

ReflectImplement r = new ReflectImplement();//通過類實例獲得

Class c1 = r.getClass();

Class subClass = c1.getSuperclass();//通過類實例獲得父類對象

Class c2 = ReflectImplement.class;//通過類名.class獲得

Class c3 = Class.forName("ReflectImplement");//通過類名字符串獲得

2、獲得類名稱

c1.getName();

3、修飾符Modifier

Modifier.toString(c2.getModifiers())//類的修飾符

Field[] fields1 = c2.getDeclaredFields();//該方法訪問

Modifier.toString(field1[0].getModifiers())

4、檢索類接口

Class [] inf = c2.getInterfaces();

5、檢索類所有成員

Field[] fields = c2.getFields();//該方法只能訪問公共變量

for(int i = 0; i < fields.length; i++)

{

String str = fields[i].getName() + "" + fields[i].getType().getName();

}

Field[] fields1 = c2.getDeclaredFields();//該方法訪問所有變量

6、檢索類的構造函數

Constructor[] constructor = c1.getDeclaredConstructors();

for(int i = 0; i < constructor.length; i++)

{

Constructor cstr = constructor[i];

System.out.print("\n" + cstr.getName());

System.out.print("\n" + cstr.getDeclaringClass());

Class[] cp = cstr.getParameterTypes();

for(int j = 0; j < cp.length; j++)

{

System.out.print("\n" + cp[j]);

}

}

7、檢索類的方法

Method [] methods = c1.getDeclaredMethods();

for(int i = 0; i < methods.length; i++)

{

Method method = methods[i];

Class cp[] = method.getParameterTypes();//該方法對應的參數類型

method.getExceptionTypes();

}

-------------------------------------------高級用法案例---------------------------------------

1. 得到某個對象的屬性-

/*

OWNER 是一個類實例 A a。

*/

public Object getProperty(Object owner, String fieldName)
{
Class<?> class1 = owner.getClass();
Field[] fields = class1.getFields();//遍歷所有的屬性(public)
for(int i = 0; i < fields.length; i++)
{
System.out.print(fields[i].getName());
}


Field field = class1.getField(fieldName);//通過Class得到類聲明的屬性。
Object object = field.get(owner);//通過對象得到該屬性的實例,如果這個屬性是非公有的,這裡會報IllegalAccessException。
System.out.print(object);
}
return null;
}

/*

rest是一個類實例 B b

*/

public boolean isValidate(Restaurant(one class) rest) {
Class<?> clazz = rest.getClass();
Field[] fields = clazz.getFields();
for (Field field : fields) {
try {
Object object = field.get(rest);
if (object == null) {
System.out.println(field.getName() + "-->is null");
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}

得到類的靜態屬性


public Object getStaticProperty(Object owner, String fieldName)
{
Class<?> class1 = owner.getClass();
Field field = class1.getField(fieldName);//該屬性是靜態的,所以直接從類的Class裡取。
Object object = field.get(class1);
return null;
}

//執行某對象的方法

public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception
{
Class<?> ownerClass = owner.getClass();
Class<?>[] argsClass = new Class[args.length];
for(int i = 0, j = args.length; i < j; i++)
{
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);//查找匹配的方法
return method.invoke(owner, args);

return method.invoke(null, args);//如果是靜態方法,則用NULL,因不需要借助實例對象
}

//新建實例對象

Class newoneClass= Class.forName(className);

Class[] argsClass= new Class[args.length];

for (int i = 0, j= args.length; i< j; i++) {

argsClass[i]= args[i].getClass();

}

Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args); //新建實例。

如果不需要參數,可以直接使用newoneClass.newInstance()來實現。

Copyright © Linux教程網 All Rights Reserved