Java 反射学习

最近在看《java 核心技术》基础篇中,看到了反射一节。记录下,待后续参考复习;

1、 在java.lang.reflect包中有三个类Field、 Method和Constructor分别用于描述类的域、方法和构造器。这三个类都有一个叫做getName的方法,用来返回项目的名称。

Field类有一个getType方法,用来返回描述域所属类型的Class对象。 Method和Constructor类有能够报告参数类型的方法, Method类还有一个可以报告返回类型的方法。这三个类还有一个叫做getModifiers的方法,它将返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用状况。

另外,还可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的整型数值。例如,可以使用Modifier类中的isPublic、 isPrivate或isFinal判断方法或构造器是否是public、 private或final。我们需要做的全部工作就是调用Modifier类的相应方法,并对返回的整型数值进行分析,另外,还可以利用Modifier.toString方法将修饰法打印出来。

Class类中的getFields、 getMethods和getConstructors方法将分别返回类提供的public域、方
法和构造器数组,其中包括超类的公有成员。 Class类的getDeclareFields、 getDeclareMethods和
getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受
保护成员,但不包括超类的成员。

例子:
输入:类名称
输出:类的构造器、方法、属性

/**
 * @Author: YLBG-YCY-1325
 * @Description: 反射
 * @Date: 2017/3/31
 */
public class ReflectionTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入类的全称(e.g. java.util.Date):");
        String className = scanner.next();

        try {
            Class cls = Class.forName(className);
            Class superClass = cls.getSuperclass();
            String modifier = Modifier.toString(cls.getModifiers());
            // 获取类前面的修饰符
            if (modifier.length() > 0) {
                System.out.printf(modifier + " ");
            }
            System.out.printf("class" + className);
            // 超类继承
            if (null != superClass && superClass != Object.class) {
                System.out.printf(" extends " + superClass.getName());
            }
            System.out.printf("\n{\n");
            printFileds(cls);
            System.out.println();
            printContructors(cls);
            System.out.println();
            printMethods(cls);
            System.out.println("}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

    /**
     * 打印类的所有构造器
     * @param cls 反射类
     */
    public static void printContructors(Class cls) {
        Constructor[] constructors = cls.getConstructors();
        for (Constructor constructor : constructors) {
            String modifier = Modifier.toString(constructor.getModifiers());
            if (modifier.length()>0){
                System.out.printf(modifier+" ");
            }
            System.out.printf(constructor.getName()+"(");

            Class[] paramsType = constructor.getParameterTypes();
            for (int j=0;j<paramsType.length;j++){
                if (j>0){
                    System.out.printf(",");
                }
                System.out.printf(paramsType[j].getName());
            }
            System.out.printf(");\n");
        }
    }

    /**
     * 打印所有方法
     * @param cls 反射类
     */
    public static void printMethods(Class cls){
        Method[] methods = cls.getMethods();

        for (Method method:methods){
            String modifier = Modifier.toString(method.getModifiers());
            if (modifier.length()>0){
                System.out.printf(modifier+" ");
            }
            //获取返回类型
            Class returnType = method.getReturnType();
            System.out.printf(returnType.getName()+" ");
            System.out.printf(method.getName()+"(");
            //获取参数类型
            Class[] paramType = method.getParameterTypes();
            for (int i=0;i<paramType.length;i++){
                if (i>0){
                    System.out.printf(",");
                }
                System.out.printf(paramType[i].getName());
            }
            System.out.printf(");\n");
        }
    }


    /**
     * 打印类的所有属性
     * @param cls 反射类
     */
    private static void  printFileds(Class cls){
        Field[] fields = cls.getDeclaredFields();
        for (Field field:fields){
            String modifier = Modifier.toString(field.getModifiers());
            Class fieldType = field.getType();
            if (modifier.length()>0){
                System.out.printf(modifier + " ");
            }
            System.out.printf(fieldType+" ");
            System.out.printf(field.getName()+";\n");
        }
    }

}

上面,程序运行结果:

输入类的全称(e.g. java.util.Date):
java.lang.Integer
public final classjava.lang.Integer extends java.lang.Number
{
public static final int MIN_VALUE;
public static final int MAX_VALUE;
public static final class java.lang.Class TYPE;
static final class [C digits;
static final class [C DigitTens;
static final class [C DigitOnes;
static final class [I sizeTable;
private final int value;
public static final int SIZE;
public static final int BYTES;
private static final long serialVersionUID;

public java.lang.Integer(int);
public java.lang.Integer(java.lang.String);

public static int numberOfLeadingZeros(int);
public static int numberOfTrailingZeros(int);
public static int bitCount(int);
public boolean equals(java.lang.Object);
public static java.lang.String toString(int,int);
public java.lang.String toString();
public static java.lang.String toString(int);
public static int hashCode(int);
public int hashCode();
public static int min(int,int);
public static int max(int,int);
public static int reverseBytes(int);
public int compareTo(java.lang.Integer);
public volatile int compareTo(java.lang.Object);
public byte byteValue();
public short shortValue();
public int intValue();
public long longValue();
public float floatValue();
public double doubleValue();
public static java.lang.Integer valueOf(java.lang.String,int);
public static java.lang.Integer valueOf(int);
public static java.lang.Integer valueOf(java.lang.String);
public static java.lang.String toHexString(int);
public static int compare(int,int);
public static java.lang.Integer decode(java.lang.String);
public static int reverse(int);
public static int sum(int,int);
public static int parseInt(java.lang.String);
public static int parseInt(java.lang.String,int);
public static long toUnsignedLong(int);
public static int compareUnsigned(int,int);
public static int divideUnsigned(int,int);
public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);
public static java.lang.Integer getInteger(java.lang.String,int);
public static java.lang.Integer getInteger(java.lang.String);
public static int highestOneBit(int);
public static int lowestOneBit(int);
public static int parseUnsignedInt(java.lang.String);
public static int parseUnsignedInt(java.lang.String,int);
public static int remainderUnsigned(int,int);
public static int rotateLeft(int,int);
public static int rotateRight(int,int);
public static int signum(int);
public static java.lang.String toBinaryString(int);
public static java.lang.String toOctalString(int);
public static java.lang.String toUnsignedString(int);
public static java.lang.String toUnsignedString(int,int);
public final void wait();
public final void wait(long,int);
public final native void wait(long);
public final native java.lang.Class getClass();
public final native void notify();
public final native void notifyAll();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值