A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.felay.reflect;

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 FeflectDemo {
        /**
         * 1.在运行时分析类的能力<br>
         * 2.在运行中查看对象<br>
         * 3.实现数组的操作代码<br>
         * 4.利用Method对象<br>
         * 反射是一种功能强大且复杂的机制,使用它的主要对象是工具的构造者,而不是应用程序员<br>
         * 能够分析类的能力的程序被成为反射<br>
         */
        public static void main(String[] args) {
                // 保存要输入的类名
                String name ;
                System.out.print("请输入您输入的类名:");
                Scanner sc = new Scanner(System.in);
                name=sc.next();
                try {
                        Class<?> cl = Class.forName(name);
                        // 获取父类
                        Class<?> superClass = cl.getSuperclass();
                        // 获取修饰符
                        String modifier = Modifier.toString(cl.getModifiers());
                        if (modifier.length() > 0)
                                System.out.print(modifier + " ");
                        // 获取基本类型
                        System.out.print("class " + cl.getSimpleName());
                        // 当存在父类的时候就继承于父类
                        if (superClass != null && superClass != Object.class)
                                System.out.print(" extends" + superClass.getSimpleName());
                        System.out.println("\n{\n");
                        printFileds(cl);
                        printContractors(cl);
                        printMethods(cl);
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                }
        }

        // 打印所有构造函数
        public static void printContractors(Class<?> cl) {
                Constructor<?>[] constructors = cl.getDeclaredConstructors();
                System.out.println("的所有构造函数为:");
                for (Constructor<?> constructor : constructors) {
                        String name = constructor.getName();
                        System.out.print("");
                        String modifer = Modifier.toString(constructor.getModifiers());
                        if (modifer.length() > 0)
                                System.out.print(modifer + " ");
                        System.out.print(name + "(");
                        Class<?>[] paraTypes = constructor.getParameterTypes();
                        for (int i = 0; i < paraTypes.length; i++) {
                                if (i > 0)
                                        System.out.print(",");
                                System.out.print(paraTypes[i].getSimpleName());
                        }
                        System.out.println(")");
                }
        }

        // 打印所有方法
        public static void printMethods(Class<?> cl) {
                System.out.println("所有的方法为:");
                Method[] methods = cl.getDeclaredMethods();
                for (Method method : methods) {
                        Class<?> retType = method.getReturnType();
                        String name = method.getName();
                        System.out.print("");
                        String modifer = Modifier.toString(method.getModifiers());
                        if (modifer.length() > 0)
                                System.out.print(modifer + " ");
                        System.out.print(retType.getName() + " " + name + "(");
                        Class<?>[] paramTypes = method.getParameterTypes();
                        for (int i = 0; i < paramTypes.length; i++) {
                                if (i > 0)
                                        System.out.print(",");
                                System.out.print(paramTypes[i].getName());
                        }
                        System.out.println(");");
                }
        }

        // 打印所有字段
        public static void printFileds(Class<?> cl) {
                Field[] fields = cl.getFields();
                if (fields.length > 0) {
                        for (int i = 0; i < fields.length; i++) {
                                System.out.println(fields[i]);
                        }
                }
        }
}
学习反射总感觉不知道它该应用于什么地方?有经验的哥哥姐姐能讲一下么?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

1 个回复

倒序浏览
一般在开发针对java语言相关的开发工具时使用吧,比如你要开发一个新框架(已有spring,你做个summer),另外的人使用你的框架,在运行的同时需要对下游的代码进行一定的分理。
有比如对java运行的监控工具、调试工具、测试工具。方法学上的新编程方式,AOP,Event-driving,建模的新工具等等,对自己代码的监控。
偏Java系统一些的开发。通常的行业应用用的不多。 而且被很多人误用,在没必要用的时候使用。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马