能够分析 类能力的程序称为反射,反射机制可以用来:
- 在运行时分析类的能力
- 在运行时查看对象
- 实现通用的数组操作代码
- 利用Method对象
这篇博客讲的比较详细,可以借鉴参考https://blog.youkuaiyun.com/Caide3/article/details/52402764
利用反射分析类的能力:Field、 Method 和 Constructor
package reflection;
import java.util.*;
import java.lang.reflect.*;
public class ReflectionTest {
public static void main(String[] args) {
String name;
if (args.length > 0) name = args[0];
else {
Scanner in = new Scanner(System.in);
System.out.println("Enter class name (e.g. java.util.Date): ");
name = in.next();
}
try {
Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length() > 0)
System.out.print(modifiers + " ");
System.out.print("class" + name);
if (supercl != null && supercl != Object.class)
System.out.print(" extends " + supercl.getName());
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.exit(0);
}
public static void printConstructors(Class cl) {
Constructor[] constructors = cl.getDeclaredConstructors();
for (Constructor c : constructors) {
String name = c.getName();
System.out.println();
String modifiers = Modifier.toString(c.getModifiers());
if (modifiers.length() > 0)
System.out.print(modifiers + " ");
System.out.print(name + "(");
Class[] paramTypes = c.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.print(");");
}
}
public static void printMethods(Class cl) {
Method[] methods = cl.getDeclaredMethods();
for (Method m : methods) {
Class retType = m.getReturnType();
String name = m.getName();
System.out.print(" ");
String modifiers = Modifier.toString(m.getModifiers());
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.print(retType.getName() + " " + name + "(");
Class[] paramTypes = m.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(") ;");
}
}
public static void printFields(Class cl) {
Field[] fields = cl.getDeclaredFields();
for (Field f : fields) {
Class type = f.getType();
String name = f.getName();
System.out.print(" ");
String modifiers = Modifier.toString(f.getModifiers());
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.println(type.getName() + " " + name + ";");
}
}
}
输出结果为:
public final classjava.lang.Double extends java.lang.Number
{
public java.lang.Double(double);
public java.lang.Double(java.lang.String);
public boolean equals(java.lang.Object) ;
public static java.lang.String toString(double) ;
public java.lang.String toString() ;
public int hashCode() ;
public static int hashCode(double) ;
public static double min(double, double) ;
public static double max(double, double) ;
public static native long doubleToRawLongBits(double) ;
public static long doubleToLongBits(double) ;
public static native double longBitsToDouble(long) ;
public volatile int compareTo(java.lang.Object) ;
public int compareTo(java.lang.Double) ;
public byte byteValue() ;
public short shortValue() ;
public int intValue() ;
public long longValue() ;
public float floatValue() ;
public double doubleValue() ;
public static java.lang.Double valueOf(java.lang.String) ;
public static java.lang.Double valueOf(double) ;
public static java.lang.String toHexString(double) ;
public static int compare(double, double) ;
public static boolean isNaN(double) ;
public boolean isNaN() ;
public static boolean isFinite(double) ;
public static boolean isInfinite(double) ;
public boolean isInfinite() ;
public static double sum(double, double) ;
public static double parseDouble(java.lang.String) ;
public static final double POSITIVE_INFINITY;
public static final double NEGATIVE_INFINITY;
public static final double NaN;
public static final double MAX_VALUE;
public static final double MIN_NORMAL;
public static final double MIN_VALUE;
public static final int MAX_EXPONENT;
public static final int MIN_EXPONENT;
public static final int SIZE;
public static final int BYTES;
public static final java.lang.Class TYPE;
private final double value;
private static final long serialVersionUID;
}
在运行时使用反射分析对象:查看对象域的关键方法是 Field类中的 get 方法
public class Employee {
private String name;
private double salary;
public Employee(String name,double salary){
this.name = name;
this.salary = salary;
}
public static void main(String[] args){
Employee e = new Employee("John",12000);
Class c1 = e.getClass();
Field f = null,f1 = null;
try {
f = c1.getDeclaredField("name");
f1 = c1.getDeclaredField("salary");
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
}
// f.setAccessible(true);
try {
Object v = f.get(e);
System.out.println(String.valueOf(v)); //John
System.out.println(f1.getDouble(e)); //12000.0
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
}
}
使用反射编写泛型数组代码:将一个 Employee[ ]临时地转换成 Object[ ] 数组, 然后再把它转换回来是可以的,但一 从开始就是 Objectt ] 的数组却永远不能转换成 Employe ] 数组。
public class CopyOfTest {
public static void main(String[] args){
int[] a = { 1, 2, 3 };
a = (int[]) goodCopyOf(a, 10);
System.out.println(Arrays.toString(a)); //[1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
String[] b = { "TonT", "Dick" , "Harry" };
b = (String[]) goodCopyOf(b, 10);
System.out.println(Arrays.toString(b)); //[TonT, Dick, Harry, null, null, null, null, null, null, null]
System.out.println("The following call will generate an exception. ") ;
b = (String[]) badCopyOf(b , 10) ;
//Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
}
public static Object[] badCopyOf(Object[] a, int newLength){ // not useful
Object[] newArray = new Object[newLength];
System.arraycopy(a,0,newArray,0,Math.min(a.length,newLength));
return newArray;
}
public static Object goodCopyOf(Object a, int newLength){
Class cl = a.getClass();
if (!cl.isArray()) return null;
Class commponentType = cl.getComponentType();
int length = Array.getLength(a);
System.out.println(length);
Object newArray = Array.newInstance(commponentType,newLength);
System.arraycopy(a,0,newArray,0,Math.min(length,newLength));
return newArray;
}
}