1. 程式人生 > >利用反射獲取子類,父類,介面的資訊

利用反射獲取子類,父類,介面的資訊

1.測試類:

package com.example;

import com.example.utils.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2017/1/4 0004.
 */
public class Test2 {
    public static void main(String[] arg) throws
ClassNotFoundException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException, InstantiationException, IllegalAccessException { //1.根據包名獲取class物件 Class<?> dClazz = Class.forName(Constants.bgName); setClassInfo(dClazz,Constants.dinfo); //2.獲取父類的class物件
Class<?> cClazz = dClazz.getSuperclass(); setClassInfo(cClazz,Constants.cinfo); //3.操作子類所實現的介面的所有方法 setInterfaceInfo(dClazz); } /** * 初始化類的相關資訊 * @param clazz * @param info */ public static void setClassInfo(Class<?> clazz,String info) throws
IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException { //1.例項化物件 Object obj = clazz.newInstance(); String[] name = info.split(",");//獲取所有的屬性-值的鍵值對:記住所有的名字與屬性值一樣 for(int i=0;i<name.length;i++){ String[] value = name[i].split(":");//獲取具體的屬性:值 //2,根據屬性名獲取相應屬性 Field field = clazz.getDeclaredField(value[0]); //3.根據屬性名,和屬性的型別獲取相應的setter方法 Method method = clazz.getMethod("set" + StringUtils.initcap(value[0]), field.getType()); //4.根據屬性的型別進行賦值 String simplename = field.getType().getSimpleName(); method.invoke(obj,StringUtils.getValues(simplename,value[1])); } //列印設定的資料 System.out.println(obj.toString()); //重新通過屬性直接設定值 System.out.println("類中的值賦值後為:"); Field[] fields = clazz.getDeclaredFields(); for(int m=0;m<fields.length;m++) { //確保私有的屬性也可以賦值 fields[m].setAccessible(true); fields[m].set(obj, StringUtils.getValues(fields[m].getType().getSimpleName())); System.out.print(fields[m].getName() + "=" + fields[m].get(obj)+";"); } System.out.println(); } public static void setInterfaceInfo(Class<?> clazz) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { //1.獲取所繼承的所有介面 Class<?>[] interfaces = clazz.getInterfaces(); //2.介面中的方法是在子類中進行呼叫的,所以需要獲取子類的例項化物件 Object obj = clazz.newInstance(); for(int i=0;i<interfaces.length;i++){ //3.獲取介面中所有的方法 Method[] methods = interfaces[i].getMethods(); for(int j=0;j<methods.length;j++){ //4.獲取方法中所有的引數 Class<?>[] parameterTypes = methods[j].getParameterTypes(); //用於儲存要傳遞的數值 Object[] values = new Object[parameterTypes.length]; String simplename=""; for(int k=0;k<parameterTypes.length;k++){ //5.根據types進行傳值 values[k]=StringUtils.getValues(parameterTypes[k].getSimpleName()); } //6.最重要的一步:是子類進行呼叫方法,所以需要通過子類的class獲取方法 Method method = clazz.getMethod(methods[j].getName(), parameterTypes); method.invoke(obj,values); } //7獲取介面中的相關屬性 Field[] fields = interfaces[i].getFields(); for(int n=0;n<fields.length;n++){ fields[i].setAccessible(true); System.out.println(fields[n].getName()+"="+fields[n].get(obj)); } } } }

2.vo包中的相關類:

package com.example.vo;

/**
 * Created by Administrator on 2016/12/23 0023.
 */
public class Company {
    private String cname,caddress,cphone;
    private long cnum;
    public long getCnum() {
        return cnum;
    }

    public void setCnum(long cnum) {
        this.cnum = cnum;
    }

    public String getCphone() {
        return cphone;
    }

    public void setCphone(String cphone) {
        this.cphone = cphone;
    }

    public String getCaddress() {
        return caddress;
    }

    public void setCaddress(String caddress) {
        this.caddress = caddress;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "總公司資訊【"+"cname:"+cname+",caddress:"+caddress+",cphone:"+cphone+",cnum:"+cnum+"】";
    }
}

===================================

package com.example.vo;

/**
 * Created by Administrator on 2016/12/23 0023.
 */
public interface IInfo {
    public static  String Tag1 = "TTTAAAGGG11111";
    public static  String Tag2 = "TTTAAAGGG22222";
    public int a = 1;
    public int b=2;
    public void printSimpleData(String data);
    public void printInfo(String name,int num, double dcount,float fcount);
}

==========================================

package com.example.vo;

/**
 * Created by Administrator on 2016/12/23 0023.
 */
public class Dept extends Company implements IInfo {
    private  String dname,daddress,dphone;
    private int dnum;
    private double dcount;

    public double getDcount() {
        return dcount;
    }

    public void setDcount(double dcount) {
        this.dcount = dcount;
    }

    public int getDnum() {
        return dnum;
    }

    public void setDnum(int dnum) {
        this.dnum = dnum;
    }

    public String getDphone() {
        return dphone;
    }

    public void setDphone(String dphone) {
        this.dphone = dphone;
    }

    public String getDaddress() {
        return daddress;
    }

    public void setDaddress(String daddress) {
        this.daddress = daddress;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }



    @Override
    public void printSimpleData(String data) {
        System.out.println("this method is printSimpleData()");
    }

    @Override
    public void printInfo(String name, int num, double dcount, float fcount) {
        System.out.println("this method is printInfo(name:"+name+",num:"+num+",dcount:"+dcount+",fcount:"+fcount+")");
    }

    @Override
    public String toString() {
        return "部門資訊【"+"dname:"+dname+",daddress:"+daddress+",dphone:"+dphone+",dnum:"+dnum+",dcount:"+dcount+"】";
    }
}

3.工具類:

package com.example.utils;

import java.util.Random;

/**
 * Created by Administrator on 2016/12/23 0023.
 */
public class StringUtils {
    public static String initcap(String name){
        if(name==null || name.equals("")){
            return name;
        }
        return name.substring(0,1).toUpperCase()+name.substring(1);
    }
    public static Object getValues(String simplename,String value){
        if("int".equalsIgnoreCase(simplename) || "Integer".equalsIgnoreCase(simplename)){
            return Integer.parseInt(value);
        }
        if("double".equalsIgnoreCase(simplename)){
            return Double.parseDouble(value);
        }
        if("float".equalsIgnoreCase(simplename)){
            return Float.parseFloat(value);
        }
        if("string".equalsIgnoreCase(simplename)){
            return value;
        }
        if("boolean".equalsIgnoreCase(simplename)){
            return Boolean.parseBoolean(value);
        }
        if("long".equalsIgnoreCase(simplename)){
            return Long.parseLong("90");
        }
        return null;
    }
    public static Object getValues(String simplename){
        Random random = new Random();
        if ("int".equalsIgnoreCase(simplename) || "Integer".equalsIgnoreCase(simplename)) {
            return  123+ random.nextInt(20);
        }
        if ("double".equalsIgnoreCase(simplename)) {
            return  12.89+ random.nextInt(20);
        }
        if ("float".equalsIgnoreCase(simplename)) {
            return  11+ random.nextInt(20);
        }
        if ("string".equalsIgnoreCase(simplename)) {
            return  "abcd"+ random.nextInt(20);
        }
        if ("boolean".equalsIgnoreCase(simplename)) {
            return  false;
        }
        if("long".equalsIgnoreCase(simplename)){
            return  Long.parseLong("90"+ random.nextInt(20));
        }
        return null;
    }
}

4.常量類:

package com.example;

/**
 * Created by Administrator on 2017/1/4 0004.
 */
public class Constants {
   public static final String dinfo = "dname:深圳分公司,daddress:深圳,dphone:10000,dnum:1981,dcount:100";
   public static final String cinfo = "cname:中國電信,caddress:北京,cphone:10000,cnum:00001";
   public static final String bgName = "com.example.vo.Dept";
}