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";
}