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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© king_EE 中级黑马   /  2015-9-22 23:01  /  341 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package reflection;

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 ReflectionTest {

        public static void main(String[] args)
        {
                String name;
                if(args.length>0)
                 //args.length是传递参数的长度,而它是怎么传递的,在本类中传递的参数有哪些
                        name=args[0];
                else
                {
                        Scanner in=new Scanner(System.in);
                        System.out.println("Enter class name(e.g.java.util.Date):");
                        name=in.next();
                       
                }
               
                try
                {
                        Class c1=Class.forName(name);
                        Class superc1=c1.getSuperclass();    //这里的getSuperclass()指的是什么
                        String modifiers=Modifier.toString(c1.getModifiers());
                        if(modifiers.length()>0)
                                System.out.println("class"+name);
                        if(superc1!=null&&superc1!=Object.class)
                                System.out.println("extends"+superc1.getName());
                       
                        System.out.println("\n{\n");
                        printConstructors(c1);
                        System.out.println();
                        printMethods(c1);
                        System.out.println();
                        printFields(c1);
                        System.out.println("}");
                       
                }
                catch(ClassNotFoundException e)
                {
                        e.printStackTrace();
                }
                System.exit(0);
        }

        public static void printConstructors(Class c1)
        {
                Constructor[] constructors=c1.getDeclaredConstructors();
                for(Constructor c:constructors)
                {
                        String name=c.getName();
                        System.out.println(" ");
                        String modifiers=Modifier.toString(c.getModifiers());
                    if(modifiers.length()>0)
                            System.out.println(modifiers+" ");
            
                    Class[] paramTypes=c.getParameterTypes();
                    
                    for(int j=0;j<paramTypes.length;j++)
                    {
                            if(j>0)
                                    System.out.println(paramTypes[j].getName());
                           
                    }
                    System.out.println(");");
                    
                }
        }
       
        public static void printMethods(Class c1)
        {
                Method[] methods=c1.getDeclaredMethods();
                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[] paramTypes=m.getParameterTypes();
                        for(int j=0;j<paramTypes.length;j++)
                        {
                                if(j>0)
                                        System.out.println(",");
                                System.out.println(paramTypes[j].getName());
                                               
                        }
                        System.out.println(");");
                }
               
        }
        public static void printFields(Class c1)
        {
                Field[] fields=c1.getDeclaredFields();
                for(Field f:fields)
                {
                        Class type=f.getType();
                        String name=f.getName();
                        System.out.print(" ");
                        String modifiers=Modifier.toString(f.getModifiers());
                       
                        if(modifiers.length()>0)
                                System.out.println(type.getName()+" "+name+";");
                }
        }
}
//   谁能给我详细分析下此程序,每一步的作用是什么,有是怎么实现他每一个步骤的

5 个回复

正序浏览
清心玉质 发表于 2015-9-23 13:47
反射是获取一个未知类,对即将获取的类情况不清楚的 你再好好看看反射那块 ...

恩 ,明白了,谢谢啊
回复 使用道具 举报
反射是获取一个未知类,对即将获取的类情况不清楚的 你再好好看看反射那块
回复 使用道具 举报
清心玉质 发表于 2015-9-23 00:08
//args.length是传递参数的长度,而它是怎么传递的,在本类中传递的参数有哪些
args是主 ...

   Class superc1=c1.getSuperclass();    //这里的getSuperclass()指的是获取父类

这里的获取父类 是不是指的是  Object  吗  ,如果 不是   我这个程序内没有明显的继承?
回复 使用道具 举报
                 //args.length是传递参数的长度,而它是怎么传递的,在本类中传递的参数有哪些
args是主函数的参数 在编译的时候传进来 传递的参数是字符数组。
                        Class superc1=c1.getSuperclass();    //这里的getSuperclass()指的是获取父类
                        String modifiers=Modifier.toString(c1.getModifiers());获取修饰符转为字符串输出

这个程序就是一个类的反编译 通过主函数或键盘输入传进类名,通过反射获得构造函数 修饰符 方法 变量 继承类等等来反写一个类程序
回复 使用道具 举报
不会 , 也来学学
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马