利用反射獲取子類,父類,介面的資訊
阿新 • • 發佈:2019-02-18
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";
}