• example反射(java)


    2、JAVA反射机制简介

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

    Java 反射机制主要提供了以下功能:
    * 在运行时判断任意一个对象所属的类。
    * 在运行时构造任意一个类的对象。
    * 在运行时判断任意一个类所具有的成员变量和方法。
    * 在运行时调用任意一个对象的方法。

    反射是Java被视为动态(或准动态)语言的一个关键性质。

    3、进入代码

    我一贯认为,概念大致了解就行,关键是会用!毕竟我们是开发工程师(说的好听点,不能自己埋汰自己)!来,看下面的代码吧(记得写代码一定要加上注释啊,这才是关键):

    package com.majun.ref;

    public class Test extends SuperTest implements Interface1, Interface2
    {
    public String name;


    public Test(){

    }

    public Test(String s1, String s2){
    }


    public void print(String msg){
    }

    public int add(int a, int b)
    {
    return a + b;
    }
    }
    Test只是个为了演示而写的一个准备类,有接口实现,有超类继承,有属性,有方法!这里代码没有完全给出,也不需要详细介绍了!,下面这个类才是真正演示反射的:

    package com.majun.ref;

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

    public class ReflectTest
    {
    public static void main(String[] args) throws Exception
    {
    Class<?> classType = Class.forName("com.majun.ref.Test");

    //获取属性(getFields只能获取public类型的属性,getDeclaredFields可以获取所有属性)

    //(下同,注意Declared修饰词)

    Field[] fs = classType.getFields();?//.getDeclaredFields();?
    for(Field f : fs)
    {
    System.out.println(f.getName());
    }

    //获取指定的属性
    Field f = classType.getDeclaredField("name");//.getField("name");
    System.out.println(f.toString());

    //获取构造函数
    Constructor<?>[] cs = classType.getDeclaredConstructors();//.getConstructors();
    for(Constructor<?> c : cs)
    {
    System.out.println(c.toString());
    }

    //获取指定参数类型的构造函数
    Constructor<?> c = classType.getConstructor(java.lang.String.class, java.lang.String.class);//.getDeclaredConstructor(java.lang.String.class);
    System.out.println(c.toString());

    ?

    //获取直接实现的接口
    Type[] ts = classType.getGenericInterfaces();
    for(Type t : ts)
    {
    System.out.println(t.toString());
    }

    //获取直接继承的超类
    Type t = classType.getGenericSuperclass();
    System.out.println(t.toString());

    //获取方法
    Method[] ms = classType.getDeclaredMethods();//.getMethods();

    for(Method m : ms)
    {
    System.out.println(m.toString());
    }

    //获取指定的方法
    Method m = classType.getMethod("print", new Class[]{String.class});
    System.out.println(m.toString());

    //方法调用
    Object invoker = classType.newInstance();
    Method md = classType.getMethod("add", new Class[]{int.class, int.class});
    Object obj = md.invoke(invoker, new Object[]{new Integer(19), new Integer(65)});
    System.out.println((Integer)obj);
    }
    }
    4、哈哈

    通过上面的学习,我们应该对Java放射机制有了一个大致的了解了,对于其他一些常用的应用,比如运行时复制对象、运行时改变属性内容、动态创建数组等,这里不再演示!

  • 相关阅读:
    五大常用算法之二:动态规划算法
    五大常用算法之一:分治算法
    c++控制台程序实现定时器
    Oracle sqlplus设置显示格式命令详解
    存储的基本概念谈
    类UNIX操作系统概念
    从源代码到可执行文件
    SQL更改表字段为自增标识
    enum和int、string的转换操作
    SEO技巧汇集
  • 原文地址:https://www.cnblogs.com/feifeihu/p/2645078.html
Copyright © 2020-2023  润新知