package com.test5;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Java泛型和反射機制(泛型的好處 代碼安全簡單,自動裝箱拆箱,提高代碼的重用率)
*/
public class test5 {
public static void main(String[] args) {
Employer employer = new Employer(1000, "張三", 25);
Ref ref1 = new Ref(employer);
System.out.println("---------------------打印類信息-----------------------");
ref1.printClassMethodMessage();
System.out.println("---------------------打印類成員變量信息-----------------------");
ref1.printFieldMessage();
/* 打印顯示
---------------------打印類信息-----------------------
類的名稱是:com.test5.Employer
java.lang.String toString()
java.lang.String getName()
void setName(java.lang.String,)
int getEid()
int getAge()
void setAge(int,)
void setEid(int,)
void wait(long,)
void wait(long,long,int,)
void wait()
boolean equals(java.lang.Object,)
int hashCode()
java.lang.Class getClass()
void notify()
void notifyAll()
---------------------打印類成員變量信息-----------------------
int eid
java.lang.String name
int age
*/
}
}
/**
* 泛型類
* @param
*/
class Ref {
private T o;
//構造函數
public Ref(T o) {
this.o = o;
}
/**
* 打印類的信息,包括類的成員函數,成員變量
*/
public void printClassMethodMessage() {
//要獲取類的信息,首先要獲取類的類類型
Class c = o.getClass();//傳遞的是哪個子類的對象,c 就是子類的類類型
//獲取類的名稱
System.out.println("類的名稱是:" + c.getName());
/**
* Method類,方法對象
* 一個成員方法就是一個Method對象
* getMethods()方法獲取的是所有的public的函數,包括父類繼承而來的
* getDeclaredMethods()方法獲取的是所有該類自己聲明的方法,不問訪問權限
*/
Method[] methods = c.getMethods();//c.getDeclaredMethods()
for (int i = 0; i < methods.length; i++) {
//得到方法的返回值類型的類類型
Class returnType = methods[i].getReturnType();
System.out.print(returnType.getName() + " ");
//打印方法名字
System.out.print(methods[i].getName() + "(");
Class>[] parameterTypes = methods[i].getParameterTypes();
String para = "";
for (Class class1 : parameterTypes) {
para += class1.getName() + ",";
System.out.print(para);
}
System.out.println(")");
}
}
/**
* 獲取成員變量的信息
*/
public void printFieldMessage() {
Class c = o.getClass();
/**
* 成員變量也是對象
* java.lang.reflect.Field
* getFields()方法獲取的是所有的public 的成員變量的信息
* getDeclaredFields 獲取的是該類自己聲明的成員變量的信息
*/
// Field[] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
for (Field field : fs) {
//得到成員變量的類型的類類型
Class fieldType = field.getType();
String typeName = fieldType.getName();
//得到成員變量的名稱
String fieldName = field.getName();
System.out.println(typeName + " " + fieldName);
}
}
}
class Employer {
public Employer(int eid, String name, int age) {
this.eid = eid;
this.name = name;
this.age = age;
}
private int eid;
private String name;
private int age;
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Employer{" +
"eid=" + eid +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}