栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-6 Java学习(反射1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-6 Java学习(反射1)

文章目录
  • 一、反射机制
  • 二、Class类
  • 三、反射机制检查类的结构

一、反射机制

能够动态分析类能力的程序。
反射机制可以用来:

  • 运行时分析类的能力
  • 在运行时检查对象,例如可以编写一个适用于所有类的toString方法
  • 实现泛型数组操作代码
  • 利用Method对象,这个对象很像C++中的函数指针。
二、Class类

获得Class类的对象的三种方法

 //反射机制学习
        // 之前已经写了一个Employee对象 ee

        //1. 跟踪一个对象的类名
        Class cl=ee.getClass(); //获得一个Class类型的实例
        System.out.println(ee.getClass().getName()+" "+ ee.getName());

        //如果类在包里,包的名字也作为类名的一部分
        Random generator=new Random();
        cl=generator.getClass();
        String Name=cl.getName(); //name is java.util.Random
        
        //2. 还可以使用静态方法forName获得类名对应的Class对象
        String className="java.util.Random";
      //  Class cl2=Class.forName(className);
        
        //3. 获得class对象的第三种方法(直接获得!):
        //T是任意的Java类型,T.class代表匹配的类的对象
        Class cl1=Random.class;
        Class c12=int.class;
        Class cl3=Employee.class;
        Class cl4=double[].class;
        
        //与e instanceof Employee不同,如果e是某个子类的实例,以下测试将失败
        if(ee.getClass()==Employee.class)
        {
            System.out.println("pass");
        }
        else System.out.println("fail");
三、反射机制检查类的结构

三个类Field,Method,Constructor分别用于描述类的字段、方法和构造器。而这三个类都有getName方法,返回Field,Method,Constructor的名字

package reflection;
import java.util.*;
import java.lang.reflect.*;

public class ReflectionTest {
    public static void main(String[] args) throws ReflectiveOperationException{
        String name;
        if(args.length>0) name=args[0];
        else
        {
            Scanner in=new Scanner(System.in);
            System.out.println("Enter class name(e.g. java.util.Date)");
            name=in.next();
        }

        Class cl=Class.forName(name);
        Class supercl=cl.getSuperclass();
        String modifiers=Modifier.toString(cl.getModifiers());

        if(modifiers.length()>0) System.out.print(modifiers+" ");

        System.out.print("class "+name);

        if(supercl!=null&&supercl!=Object.class)
            System.out.print(" extends"+supercl.getName());

        System.out.print("n{n");
        printConstructors(cl);
        System.out.println();
        printMethods(cl);
        System.out.println();
        printFields(cl);
        System.out.println();
        System.out.print("}n");
    }

    public static void printConstructors(Class cl)
    {
        Constructor[] constructors=cl.getConstructors();

        for(Constructor c:constructors)
        {
            String name=c.getName();
            System.out.print(" ");

            String modifiers=Modifier.toString(cl.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(name+"(");

            //print parameters types
            Class[] paramTypes=c.getParameterTypes();
            for(int j=0;j0) System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    public static void printMethods(Class cl)
    {
        Method[] methods=cl.getMethods();

        for(Method m:methods)
        {
            Class retType=m.getReturnType();
            String name=m.getName();

            System.out.print(" ");

            String modifiers=Modifier.toString(m.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(retType.getName()+" "+name+"(");

            Class[] paraTypes=m.getParameterTypes();

            for(int j=0;j0) System.out.print(",");
                System.out.print(paraTypes[j].getName());
            }

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

        }
    }

    public  static void printFields(Class cl)
    {
        Field[] fields=cl.getDeclaredFields();

        for(Field f:fields)
        {
            Class type=f.getType();
            String name=f.getName();
            System.out.print(" ");
            String modifier=Modifier.toString(f.getModifiers());
            if(modifier.length()>0) System.out.print(modifier+" ");
            System.out.println(type.getName()+" "+name+";");
        }

    }
}


NOTE1
类 Modifier
static String toString(int mod)
返回描述指定修饰符中的访问修饰符标志的字符串。

NOTE2
查看任意对象数据字段的名字和类型

  1. 获得对应的Class对象
  2. 在这个Class对象上调用getDeclaredFields
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号