java反射的基本概念和简单应用_java 反射基本概念和方法-程序员宅基地

技术标签: java基础  java  反射  反射机制  

能够分析类能力的程序称为反射。反射可以用来:
1.在运行时分析类的能力
2.在运行时查看对象,例如,编写一个toString方法供所有类使用
3.实现通用的操作代码。例如:通用dao
一般使用它的主要是工具制造者。

下面介绍反射机制最重要的内容—–检查类的结构
在java.lang.reflect包中有三个类Field、Constuctor、Method分别用于描述类的域、构造器和方法。其次,还可以利用Modifier类的静态方法分析getModifiers返回的整型数值。利用Modifier.toString方法来获取修饰符。
下面代码
代码描述:输入任意类的名称,打印出类的结构。

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

public class ReflectDemo {
    public static void main(String[] args) {
        try {
            System.out.println("input className:");
            Scanner sc = new Scanner(System.in);
            String className = sc.next();
            Class clazz = Class.forName(className);
            Class superClass = clazz.getSuperclass();//获取该类的父类
            String modifies = Modifier.toString(clazz.getModifiers());//获取修饰符
            if (modifies.length() > 0)
                System.out.print(modifies + " ");
            System.out.print("class " + className);
            if (superClass != null && superClass != Object.class)
                System.out.print(" extends " + superClass.getName());
            System.out.print("\n{\n");
            printFields(clazz);
            System.out.println();
            printConstructors(clazz);
            System.out.println();
            printMethods(clazz);
            System.out.print("}");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 打印该类的所有的方法
    private static void printMethods(Class clazz) {
        Method[] methods = clazz.getDeclaredMethods();//获取该类的所有方法
        for (Method method : methods) {
            Class<?> type = method.getReturnType();
            String name = method.getName();
            String modifies = Modifier.toString(method.getModifiers());
            System.out.print("  ");
            if (modifies.length() > 0)
                System.out.print(modifies + " ");
            System.out.print(type.getName() + " " + name + "(");
            Class[] parameterTypes = method.getParameterTypes();
            for (int i = 0; i < parameterTypes.length; i++) {
    
                if (i > 0)
                    System.out.print(",");
                System.out.print(parameterTypes[i].getName());
            }
            System.out.println(");");

        }
    }

    // 打印该类的所有构造方法
    private static void printConstructors(Class clazz) {
        Constructor[] constructors = clazz.getDeclaredConstructors();//获取该类的所有构造器
        for (Constructor constructor : constructors) {
            String name = constructor.getName();
            String modifies = Modifier.toString(constructor.getModifiers());
            System.out.print("  ");
            if (modifies.length() > 0)
                System.out.print(modifies + " ");
            System.out.print(name + "(");

            Class[] parameterTypes = constructor.getParameterTypes();
            for (int i = 0; i < parameterTypes.length; i++) {
    
                if (i > 0)
                    System.out.print(",");
                System.out.print(parameterTypes[i].getName());
            }
            System.out.println(");");
        }

    }

    // 打印该类的所有的属性
    private static void printFields(Class clazz) {
        Field[] fields = clazz.getDeclaredFields();//获取该类的所有属性
        for (Field field : fields) {
            Class fieldType = field.getType();
            String fieldName = field.getName();
            String modifies = Modifier.toString(field.getModifiers());
            System.out.print("  ");
            if (modifies.length() > 0)
                System.out.print(modifies + " ");
            System.out.print(fieldType.getName() + " " + fieldName + ";\n");

        }

    }
}

例如: 输入:java.lang.Double
输出结果:

public final class java.lang.Double extends java.lang.Number
{
    
    public static final double POSITIVE_INFINITY;
    public static final double NEGATIVE_INFINITY;
    public static final double NaN;
    public static final double MAX_VALUE;
    public static final double MIN_NORMAL;
    public static final double MIN_VALUE;
    public static final int MAX_EXPONENT;
    public static final int MIN_EXPONENT;
    public static final int SIZE;
    public static final java.lang.Class TYPE;
    private final double value;
    private static final long serialVersionUID;

    public java.lang.Double(double);
    public java.lang.Double(java.lang.String);

    public boolean equals(java.lang.Object);
    public static java.lang.String toString(double);
    public java.lang.String toString();
    public int hashCode();
    public static native long doubleToRawLongBits(double);
    public static long doubleToLongBits(double);
    public static native double longBitsToDouble(long);
    public int compareTo(java.lang.Double);
    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.Double valueOf(double);
    public static java.lang.Double valueOf(java.lang.String);
    public static java.lang.String toHexString(double);
    public static int compare(double,double);
    public static boolean isNaN(double);
    public boolean isNaN();
    public static boolean isInfinite(double);
    public boolean isInfinite();
    public static double parseDouble(java.lang.String);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nwpu_geeker/article/details/78711611

智能推荐

基于Android Studio+Android SDK的手机通讯录管理软件设计_android studio制作通讯录-程序员宅基地

文章浏览阅读2.9k次,点赞6次,收藏43次。开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,本文转载自http://www.biyezuopin.vip/onews.asp?不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。3.3.3 数据库表结构 7。_android studio制作通讯录

Html.ActionLink的几种用法-程序员宅基地

文章浏览阅读1.7k次。1.Html.ActionLink(“linkText”,”actionName”) 参数一:显示文本,参数二:方法名2.Html.ActionLink(“linkText”,”actionName”,”controlName”) 参数一:显示文本,参数二:方法名,参数三:控制器名3.Html.ActionLik(“linkText”,”actionName”,Values) 参数一:显示文本_html.actionlink

医药供应链挑战与冷链监测的先进技术_国外先进医药冷链技术-程序员宅基地

文章浏览阅读705次。一、医药供应链的挑战(1)药品供应链涉及多个站点医药供应链涉及多个站点,从原料的运输到药品的生产再到药品的分销,无论是到医院、临床站点、药房、还是现如今流行的DTP,直接面向患者,是我们的第一个挑战。 (2)多方参与、多种温度需求医药供应链是由多方参与的,不同的生产地点、不同的仓库、不同的目的地是我们商业供应链的特点,而对于临床供应链,还会..._国外先进医药冷链技术

SQLServer2008R2用户登录失败(错误18456)解决方法_sql 2008登录失败错误18456-程序员宅基地

文章浏览阅读8.8k次。SQL Server 2008 R2用户'sa'登录失败(错误18456),如下图:    解决办法:  1、首先用身份登录,有如下界面:  2、右键实例-- 属性,选择【安全性】,选择身份验证方式:  3、右键实例-- 【重新启动】  4、选择【安全性】-- 【登录名】-- 【sa】  5、双击【sa】,出现_sql 2008登录失败错误18456

“体面人”俞敏洪,要步罗永浩的后尘了?-程序员宅基地

文章浏览阅读248次。NEW关注Tech逆向思维视频号 最新视频→【男生的秋裤,女生的打底裤,哪个更抗冻?】出品|雷达财经 文|张凯旌 编辑|深海...

关于通过DDMS向Android系统的模拟器的sdcard中导入mp3文件的问题_ddms怎么导入音乐文件-程序员宅基地

文章浏览阅读3.9k次。问题描述: 向sdcard文件夹导入不成功,报错如下:[2011-02-11 12:27:06] Failed to push the items: Invalid argument但是试着向data文件夹导入则导入成功,但是如果文件名为中文则显示乱码,将名称改为英文或数字即可。 解决方案:重启了adb就可以向sdcard文件夹导入了,只是名称一定是英文或数字才行。若名称为中文,则依旧无法导入。重启adb的按钮位于DDMS界面上的Devices的Menu里,Reset adb就是。_ddms怎么导入音乐文件

随便推点

ssh配置免密码登录_怎么重新配置ssh免密登入-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏21次。1.Hadoop中为什么要配置免密码登录最近在学习Hadoop,在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作。例如,某个脚本能够终止并重启集群中的所有守护进程。所以,需要安装SSH,但是,SSH远程登陆的时候,需要密码验证,集群中数千台计算机,数千台计算机都需要手工输入密码,这是不太现实的,所以,就需要配置SSH无密码登录。2.环境Hado..._怎么重新配置ssh免密登入

android 开发板 root后无法打开资源管理器Device File Explorer_androidstudio device file explorer nothing to show-程序员宅基地

文章浏览阅读811次。android 开发板用 SuperSU root之后,调试设备的时候无法打开Device File Explorer了,此时需要在SuperSU中的应用程序视图列表中禁用 ADB shell 的 SU 权限,操作如下:首先断开您的 Android 设备与运行 Android Studio 的计算机的连接在您的 Android 设备上打开 SuperSU 并选择应用程序选项卡。单击 ADB shell 并选择 拒绝授权使用 USB 数据线将您的设备重新连接到开发计算机在 Android St_androidstudio device file explorer nothing to show

Struts2 在IDEA<s:datetimepicker/>的问题_idea datetimepicker控件-程序员宅基地

文章浏览阅读283次。鉴于很多人说Intellij IDEA 非常好用,我也开始了我的IDEA之旅。作为一名Eclipse的使用者,旅途中自是各种曲折。比如说今天用这个学习研究struts2真是烦不胜烦。的问题刚开始导了/struts-tags之后发现没有这个标签原因:Strust2.1开始,对于ajax类的标签不再使用"s" uri= "/struts-tags"%> 引用_idea datetimepicker控件

SSA-CNN-LSTM-Attention回归预测 |Matlab 基于麻雀算法优化卷积神经网络-长短期记忆网络结合注意力机制...-程序员宅基地

文章浏览阅读227次。作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。????个人主页:Matlab科研工作室????个人信条:格物致知。更多Matlab完整代码及仿真定制内容点击????智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统信号处理 ..._麻雀优化cnn-lstm-attention

iOS开发应用程序图标大小汇总_ios 应用程序的logo尺寸-程序员宅基地

文章浏览阅读1.3k次。随着iOS的升级,一大堆新尺寸的应用程序图标规格有出来了。除了要兼容低版本的iOS,还要兼容高版本,一个APP做下来,要生成十几种不同大小的APP图标。iOS上的图标基本分为这么几类:App Store下使用图标、应用程序主屏幕图标、Spotlight搜索结果图标、工具栏和导航栏图标、设置图标和标签栏图标等。下面就来看看我们需要设计哪些尺寸的图标:描述iPh_ios 应用程序的logo尺寸

JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?_full gc stoptheword-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏9次。内存分配与回收策略Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。 Full GC:发生在老年代上,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。 内存分配与回收策略1. 对象优先在 Eden 分配大多数..._full gc stoptheword

推荐文章

热门文章

相关标签