Java反射机制

能够分析 类能力的程序称为反射,反射机制可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象
  • 实现通用的数组操作代码
  • 利用Method对象

这篇博客讲的比较详细,可以借鉴参考https://blog.csdn.net/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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值