美文网首页
类加载机制与反射(二)

类加载机制与反射(二)

作者: 蓝枫zeke | 来源:发表于2017-04-05 10:44 被阅读0次

通过反射查看类的信息

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

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

  • 假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof 运算符进行判断
  • 编译时无法知道对象和类属于那些类,程序只能依靠运行时信息来发现该对象和类的真实信息,这就必须通过反射

1. 获得 Class 对象

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

  • 使用Class 类的forName(String clazzName)静方法。必须是完整包名。
  • 调用某个类的class属性来获取该类的 Class 对象。
  • 调用某个对象的getClass() 方法。

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

相关文章

  • 类加载机制与反射(二)

    通过反射查看类的信息 Java程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型例如:Person p...

  • java反射机制与类加载机制

    java反射机制与类加载机制 Class (Java SE 9 & JDK 9 ) - https://docs....

  • 类加载机制(二)

    加载机制系列类加载机制(一)类加载机制(二)类加载机制(三)类的加载全过程中的主动引用与被动引用 类的主动引用(会...

  • 类加载机制(一)

    加载机制系列类加载机制(一)类加载机制(二)类加载机制(三) 类加载机制 1.JVM把class文件加载到内存,对...

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • 类加载机制(三)

    加载机制系列类加载机制(一)类加载机制(二)类加载机制(三)类加载器 这里引用尚学堂的的几张图片 demo: 结果:

  • 反射机制,类加载机制

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个...

  • Java学习day-23:反射机制

    一、反射机制_Class对象获取: 1.反射机制: 反射机制是java的动态性之一;一个类被加载后,JVM 会创建...

  • 学习笔记 | JAVA的反射(二)

    利用反射机制动态加载类 、获取类的方法、获取类的属性 编译时刻加载类是静态加载类,运行时加载类是动态加载类 正常创...

  • 插件化笔记

    看这个就够了啊,深入理解Android插件化技术 插件化技术核心 类的加载机制和反射机制。 类加载 https:/...

网友评论

      本文标题:类加载机制与反射(二)

      本文链接:https://www.haomeiwen.com/subject/lwrtattx.html