利用反射获取子类,父类,接口的信息

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";
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值