利用反射,分析类

在java.lang.reflect包中有三个类分别是Field、Method和Constructor,这三个类分别用来描述类的域、方法和构造器,非常的有用。接下来就说说他们的特点。

 

Field:描述类中的域;

Method:描述类中的方法;

Constructor:描述类中的构造器。

 

首先要考虑的是如何获得一个类的Field类(Method类或Constructor类)对象呢?方法有二:

①调用Class类的对象的getField(getMethod或getConstructor)方法,可以获得该类和其超类的共有域,返回一个Field类(Method类或Constructor类)数组;

②调用Class类的对象的getDeclaredField(getDeclaredMethod或getDeclaredConstructor)方法,可以获得该类的所有声明的方法,返回一个Field类(Method类或Constructor类)数组;

 

其次得到了一个类的Field类(Method类或Constructor类)对象,可以做什么呢?既然是获得了一个类的域,那么它的所有信息都包括在这个Field类(Method类或Constructor类)对象里面,所以:

①调用该Field类(Method类或Constructor类)对象的getModifiers方法,可以返回一个整形数值,描述了该Field类(Method类或Constructor类)对象的修饰符信息;

②调用该Field类(Method类或Constructor类)对象的getDeclaringClass方法,可以返回一个用于描述类中定义的域(方法或构造器)的class类对象。例如:类中这样定义:private int ID;,那么调用此方法则会返回int.class;

③调用该Field类(Method类或Constructor类)对象的getName方法,可以返回一个字符串,描述该域(方法或构造器)的名字;

④专属Method类和Constructor类的对象的方法:getParameterTypes,该方法返回一个Class类对象的数组,描述了Method类或Constructor类的对象的参数列表;

⑤专属Method类的方法法:getReturnType,该方法返回一个Class类对象,描述了Method类对象的返回值类型。

 

package com.shawn;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * Created by 小粤 on 2015/7/23.
 */
public class ReflectionTest {

    public static void main(String[] args) {
        Class c = String.class;
        System.out.print("class " + c.getName() + ":\n\n");
        printFields(c);
        System.out.println();
        printConstructors(c);
        System.out.println();
        printMethods(c);
    }

    public static void printFields(Class c) {
        Field[] fields = c.getDeclaredFields();
        int modifier;
        for (int i = 0; i < fields.length; i++) {
            modifier = fields[i].getModifiers();
            System.out.print(Modifier.toString(modifier) + " ");
            System.out.print(fields[i].getDeclaringClass().getSimpleName() + " ");
            System.out.println(fields[i].getName());
        }
    }

    public static void printConstructors(Class c) {
        Constructor[] constructors = c.getDeclaredConstructors();
        int modifier;
        for (int i = 0; i < constructors.length; i++) {
            modifier = constructors[i].getModifiers();
            System.out.print(Modifier.toString(modifier) + " ");
            System.out.print(constructors[i].getName() + "(");

            Class[] constructorParameters = constructors[i].getParameterTypes();
            for (int j = 0; j < constructorParameters.length; j++) {
                if (j > 0) {
                    System.out.print(", ");
                }
                System.out.print(constructorParameters[j].getSimpleName());
            }

            System.out.println(")");
        }
    }

    public static void printMethods(Class c) {
        Method[] methods = c.getDeclaredMethods();
        int modifier;
        for (int i = 0; i < methods.length; i++) {
            modifier = methods[i].getModifiers();
            System.out.print(Modifier.toString(modifier) + " ");
            System.out.print(methods[i].getReturnType().getSimpleName() + " ");
            System.out.print(methods[i].getName() + "(");

            Class[] methodParameters = methods[i].getParameterTypes();
            for (int j = 0; j < methodParameters.length; j++) {
                if (j > 0) {
                    System.out.print(", ");
                }
                System.out.print(methodParameters[j].getSimpleName());
            }

            System.out.println(")");
        }
    }

}


output:

 

class java.lang.String:

private final String value
private String hash
private static final String serialVersionUID
private static final String serialPersistentFields
public static final String CASE_INSENSITIVE_ORDER

public java.lang.String(byte[], int, int)
public java.lang.String(byte[], Charset)
public java.lang.String(byte[], String)
public java.lang.String(byte[], int, int, Charset)
public java.lang.String(byte[], int, int, String)
 java.lang.String(char[], boolean)
public java.lang.String(StringBuilder)
public java.lang.String(StringBuffer)
public java.lang.String(byte[])
public java.lang.String(int[], int, int)
public java.lang.String()
public java.lang.String(char[])
public java.lang.String(String)
public java.lang.String(char[], int, int)
public java.lang.String(byte[], int)
public java.lang.String(byte[], int, int, int)

public boolean equals(Object)
public String toString()
public int hashCode()
public int compareTo(String)
public volatile int compareTo(Object)
public int indexOf(String, int)
public int indexOf(String)
public int indexOf(int, int)
public int indexOf(int)
static int indexOf(char[], int, int, char[], int, int, int)
static int indexOf(char[], int, int, String, int)
public static String valueOf(int)
public static String valueOf(long)
public static String valueOf(float)
public static String valueOf(boolean)
public static String valueOf(char[])
public static String valueOf(char[], int, int)
public static String valueOf(Object)
public static String valueOf(char)
public static String valueOf(double)
public char charAt(int)
private static void checkBounds(byte[], int, int)
public int codePointAt(int)
public int codePointBefore(int)
public int codePointCount(int, int)
public int compareToIgnoreCase(String)
public String concat(String)
public boolean contains(CharSequence)
public boolean contentEquals(CharSequence)
public boolean contentEquals(StringBuffer)
public static String copyValueOf(char[])
public static String copyValueOf(char[], int, int)
public boolean endsWith(String)
public boolean equalsIgnoreCase(String)
public static transient String format(Locale, String, Object[])
public static transient String format(String, Object[])
public void getBytes(int, int, byte[], int)
public byte[] getBytes(Charset)
public byte[] getBytes(String)
public byte[] getBytes()
public void getChars(int, int, char[], int)
 void getChars(char[], int)
private int indexOfSupplementary(int, int)
public native String intern()
public boolean isEmpty()
public static transient String join(CharSequence, CharSequence[])
public static String join(CharSequence, Iterable)
public int lastIndexOf(int)
public int lastIndexOf(String)
static int lastIndexOf(char[], int, int, String, int)
public int lastIndexOf(String, int)
public int lastIndexOf(int, int)
static int lastIndexOf(char[], int, int, char[], int, int, int)
private int lastIndexOfSupplementary(int, int)
public int length()
public boolean matches(String)
private boolean nonSyncContentEquals(AbstractStringBuilder)
public int offsetByCodePoints(int, int)
public boolean regionMatches(int, String, int, int)
public boolean regionMatches(boolean, int, String, int, int)
public String replace(char, char)
public String replace(CharSequence, CharSequence)
public String replaceAll(String, String)
public String replaceFirst(String, String)
public String[] split(String)
public String[] split(String, int)
public boolean startsWith(String, int)
public boolean startsWith(String)
public CharSequence subSequence(int, int)
public String substring(int)
public String substring(int, int)
public char[] toCharArray()
public String toLowerCase(Locale)
public String toLowerCase()
public String toUpperCase()
public String toUpperCase(Locale)
public String trim()

Process finished with exit code 0

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值