类加载机制与反射(二)

2017-04-05  本文已影响0人  蓝枫zeke

通过反射查看类的信息

Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型
例如:Person p = new Student();
编译类型为:Person
运行类型为:Student

为了解决这种问题,有两种方式:

1. 获得 Class 对象

java程序中获得 Class 对象有三种方式

2. 从 Class 对象中获取信息

具体使用查阅API文档,下面以一个例子来说明

package com.example;

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

/**
 * Created by zhoujian on 2017/4/5.
 */

public class ClassTest {


    private ClassTest() {
        System.out.println("执行无参构造函数");
    }

    public ClassTest(String name) {
        System.out.println("执行有参构造函数");
    }

    public void method() {
        System.out.println("执行无参method方法");

    }

    public void method(String str) {
        System.out.println("执行有参method方法");
    }


    public static void main(String[] args) {
        //获取Class对象

        Class<ClassTest> aClass = ClassTest.class;


        //获取Class对象所对应类的全部构造器
        Constructor<?>[] constructors = aClass.getDeclaredConstructors();
        System.out.println("ClassTest的全部构造器如下:");
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        //获取Class对象所对应类的全部public构造器
        Constructor<?>[] cons = aClass.getConstructors();
        System.out.println("-----------------------------------");
        System.out.println("ClassTest的全部public构造器如下:");
        for (Constructor<?> c : cons) {
            System.out.println(c);
        }

        //获取Class对象所对应类的全部public方法
        Method[] methods = aClass.getMethods();
        System.out.println("-----------------------------------");
        System.out.println("ClassTest的全部public方法如下:");
        for (Method method : methods) {
            System.out.println(method);
        }
        

        //获取Class对象所对应类的指定方法
        try
        {
            Method meth = aClass.getMethod("method", String.class);
            System.out.println("-----------------------------------");
            System.out.println("ClassTest里带一个字符串参数的method方法:"+meth);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

Snip20170405_1.png

3. Java8 新增的方法参数反射

package com.example;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;

/**
 * Created by zhoujian on 2017/4/3.
 */

public class TextA
{

    public void rep(String string, List<String> list)
    {

    }

    public static void main(String[] args) {

        Class<TextA> aClass = TextA.class;


        try {
            //获取带有两个参数的 rep方法
            Method rep = aClass.getMethod("rep", String.class, List.class);
            //获取指定方法参数个数
            int count = rep.getParameterCount();
            System.out.println("rep方法参数个数:" + count);


            //获取rep 方法的所有参数信息
            Parameter[] parameters = rep.getParameters();
            int index = 1;
            for (Parameter parameter : parameters) {
                //方法返回该类的class文件中是否包含了方法的形参名信息
                System.out.println("----第" + index++ + "个参数信息---");
                System.out.println("参数名:" + parameter.getName());
                System.out.println("形参类型:" + parameter.getType());
                System.out.println("泛型类型:" + parameter.getParameterizedType());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

Snip20170405_3.png
上一篇下一篇

猜你喜欢

热点阅读