天天看點

java反射接口實作類_java反射簡單執行個體

這篇博友的總結的反射知識點是比較全面的

下面介紹我用反射做的兩個功能

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]