這篇博友的總結的反射知識點是比較全面的
下面介紹我用反射做的兩個功能
1、列出被反射類所有的屬性和繼承自接口或者父類的屬性
2、調用反射類的方法
3、通過反射調用被反射類的setter方法
先列出接口類,父類,被反射的類
接口類:
package com.test.reflect.helper;
public interface ChinaInterface {
public static final String name="Rollen";
public static int age=20;
public void sayChina();
public void sayHello(String name, int age);
}
父類
package com.test.reflect.helper;
public class FatcherClass {
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
private String birthday; //private不會繼承
public String sex; //public 的屬性會被繼承
}
反射類
package com.test.reflect.helper;
public class Person extends FatcherClass implements ChinaInterface{
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.age = age;
this.name = name;
}
public void setName(String name)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "[" + this.name + " " + this.age + "]";
}
private String name;
private int age;
@Override
public void sayChina() {
// TODO Auto-generated method stub
System.out.println(" China, hi nice to meet you!");
}
@Override
public void sayHello(String name, int age) {
// TODO Auto-generated method stub
System.out.println("hello ,i am "+name+"and i am "+age +"yeas old");
}
}
下面我們實作功能一:列出被反射類所有的屬性和繼承自接口或者父類的屬性
package com.test.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class GetAllFieldsAndInterfaceParentClass {
public static void main(String[] args) {
method();
}
public static void method() {
Class> demo = null;
try {
// 取得object的 執行個體,不是對象
demo = Class.forName("com.test.reflect.Person");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("-------------擷取object所有的屬性--------------");
// 擷取 所有的聲明的字段
Field[] fieldArray = demo.getDeclaredFields();
for (int i = 0; i < fieldArray.length; i++) {
// 擷取權限修飾符 傳回int類型,再轉化為String類型
int mo = fieldArray[i].getModifiers();
String priv = Modifier.toString(mo);
// 擷取字段的類型
Class> type = fieldArray[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ fieldArray[i].getName());
}
System.out.println("-------------實作的接口或者父類的屬性--------------");
//擷取所有父類或繼承的接口
Field[] inhertArray=demo.getFields();
System.out.println(inhertArray.length);
for(int j=0;j
{
//擷取權限
int mo=inhertArray[j].getModifiers();
String priv=Modifier.toString(mo);
//擷取接口或類的類型
Class> type=inhertArray[j].getType();
System.out.println(priv+" "+type.getName()+" "+inhertArray[j].getName());
}
}
}
結果:
-------------擷取object所有的屬性--------------
private java.lang.String name
private int age
-------------實作的接口或者父類的屬性--------------
3
public static final java.lang.String name
public static final int age
public java.lang.String sex
實作功能二、調用反射類的方法
package com.test.reflect;
import java.lang.reflect.Method;
public class UseReflectMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("ok");
Class> demo = null;
try {
demo = Class.forName("com.test.reflect.helper.Person");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//擷取被反射類的方法
Method method = demo.getMethod("sayChina");
//傳遞類執行個體,調用對應方法
method.invoke(demo.newInstance());
//擷取被反射類的方法,并說明所要傳遞的參數的類型
Method method2=demo.getMethod("sayHello",String.class,int.class);
//傳遞參數,并調用方法
method2.invoke(demo.newInstance(), "jack",234);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
結果:
China, hi nice to meet you!
hello ,i am jackand i am 234yeas old
實作功能三:通過反射調用被反射類的setter方法
package com.test.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class UseGetterAndSetter {
public static void main(String [] args)
{
Class> demo=null;
try {
demo=Class.forName("com.test.reflect.helper.Person");
Object obj=demo.newInstance();
Field[] declaredFieldArray=demo.getDeclaredFields();
for(int i=0;i
{
//擷取修飾符,通路 權限
int mo=declaredFieldArray[i].getModifiers();
String priv=Modifier.toString(mo);
//擷取變量類型
Class> type=declaredFieldArray[i].getType();
if(type.getName()=="java.lang.String")
invokeGetAndSet(type,declaredFieldArray[i].getName(),obj,"jackvin");
else if(type.getName()=="int")
invokeGetAndSet(type,declaredFieldArray[i].getName(),obj,23);
}
System.out.println(obj);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void invokeGetAndSet(Class> type,String field,Object obj,String fieldValue)
{
//拼接成setFiled()方法的名字
String methodName="set"+field.substring(0,1).toUpperCase()+field.substring(1);
try {
Method method= obj.getClass().getMethod(methodName, type);
method.invoke(obj,fieldValue);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void invokeGetAndSet(Class> type,String field,Object obj,int fieldValue)
{
//拼接成setFiled()方法的名字
String methodName="set"+field.substring(0,1).toUpperCase()+field.substring(1);
try {
Method method= obj.getClass().getMethod(methodName, type);
method.invoke(obj,fieldValue);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
結果:
[jackvin 23]